Zaraz zaraz. Wątek w dziale C. Więc przykłady w C :-)
Zakładam że pracujesz w systemie GNU/Linux lub z kompilatorem MinGW i masz skonfigurowane poprawnie ścieżki do narzędzi.
Puryści proszę nie bić za koszmarny maksymalnie kod. Ma być demonstracją co i jak się rozwija, co widać w ABI itp. Z poprawnym tworzeniem kodu nie ma nic wspólnego a ty początkujący nie wzoruj się na takim tworzeniu oprogramowania.
Oto przykład main.c:
#include <stdio.h>
#define OTO_STALA 5
#define OTO_MAKRO(x) printf("Jestem makro OTO_MAKRO i przekazano mi %d\n", x);
/* Zmienne różne... */
int globalna_zerowana;
int globalna = 12;
static int statyczna_zerowana;
static int statyczna = 333;
typedef long typek_t;
/* Funkcje różne ... */
void funkcja_z_int(int argument) {
printf("Oto ja %s z int = %d\n", __FUNCTION__, argument);
}
void funkcja() {
;
}
static void funkcja_statyczna() {
;
}
int main(void) {
typek_t zmienna = 7682892;
printf("Zmienne ...\n");
printf("globalna_zerowana = %d\n", globalna_zerowana);
printf("globalna = %d\n", globalna);
printf("statyczna_zerowana = %d\n", statyczna_zerowana);
printf("statyczna = %d\n", statyczna);
printf("A teraz sobie wywołamy... \n");
funkcja_z_int(12);
printf("A teraz funkcja()\n");
funkcja();
printf("A teraz funkcja_statyczna()\n);
funkcja_statyczna();
printf("A teraz makro\n");
OTO_MAKRO(OTO_STALA);
printf("typek_t zmienna = %ld\n", zmienna);
return 0;
}
Zatrzymanie kompilatora na etapie (1)włączenia plików i rozwinięcia makr:
gcc -E -o main.E main.c
Zatrzymanie na etapie generowania (2)asemblera po (1) włączeniu i rozwinięciu makr:
gcc -S -o main.S main.c
Zatrzymanie na etapie budowy (3)pliku obiektowego po (1)włączeniu i rozwinięciu makr i (2)wygenerowaniu asemblera:
gcc -c -o main.o main.c
Przy tym ostatnim możesz nie podawać -o bo sam wie że ma zbudować main.o
Zatrzymanie na etapie zbudowanego programu po (1) , (2) i (3):
gcc -o main main.c
Zerknij teraz do main.E i main.S ... tylko się nie przeraź (tym pierwszym). Poszukaj makr, zmiennych, funkcji... zobacz co się z nimi dzieje.
A teraz ABI (ang. Application Binary Interface)
Wyświetlenie symboli w pliku *.o:
objdump -t main.o
Wyświetlenie symboli ładowanych dynamicznie z pliku main:
objdump -T main
Wyświetlenie sekcji w pliku *.o
objdump -x main.o
Dezasemblacja pliku main:
objdump -d main
Tryb "gadatliwego" linkera przy kompilacji: (tu zobaczysz jakie dodatkowe pliki włącza, skąd i kiedy.. )
gcc -Wl,--verbose -o main main.c
Także popatrz czy "widać" static, jakie funkcje widać itp..
I na koniec, wisienka :-) Kompilowanie programu w trybie gdzie będziesz widział jak wygląda program w C i asembler:
gcc -g1 -o main main.c
objdump -S main
To są bardzo szerokie zagadnienia. Każdego opisać nie sposób w poście na forum. Zaraz będziesz pytał co oznacza g,w,F,O w wyjściu komend. Odsyłam do manuali i dokumentacji. Ale już po tym co napisałem, możesz zrozumieć jak działa kompilator :-)
Smacznego :-)