Her er en kodebit jeg skrev i C:
#include
#include
void foo();
int main(int argc, char* argv[]) {
foo();
}
void foo() {
printf("Foo bar baz!");
}
Jeg kjørte gcc -c foo.c
på den koden. Her er hva nm foo.o
viste:
000000000000001b T foo 0000000000000000 T main U printf
For dette eksempelet kjører jeg Ubuntu Linux 64-bit; det er derfor den 8-sifrede sekskanten du ser er 16-sifret her. :-)
Sekskantsifferet du ser er adressen til den aktuelle koden i objektfilen i forhold til begynnelsen av .text.
seksjon. (forutsatt at vi adresserer deler av objektfilen som begynner på 0x0). Hvis du kjører objdump -td foo.o
, vil du se følgende i utdataene:
Disassembly of section .text: 0000000000000000 : 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 83 ec 10 sub $0x10,%rsp 8: 89 7d fc mov %edi,-0x4(%rbp) b: 48 89 75 f0 mov %rsi,-0x10(%rbp) f: b8 00 00 00 00 mov $0x0,%eax 14: e8 00 00 00 00 callq 19 19: c9 leaveq 1a: c3 retq 000000000000001b : 1b: 55 push %rbp 1c: 48 89 e5 mov %rsp,%rbp 1f: b8 00 00 00 00 mov $0x0,%eax 24: 48 89 c7 mov %rax,%rdi 27: b8 00 00 00 00 mov $0x0,%eax 2c: e8 00 00 00 00 callq 31 31: c9 leaveq 32: c3 retq
Legg merke til at disse to symbolene stemmer overens med oppføringene vi så i symboltabellen fra nm
. Husk at disse adressene kan endres hvis du kobler denne objektfilen til andre objektfiler. Husk også at callq
at 0x2c vil endres når du kobler denne filen til det libc systemet ditt tilbyr, siden det for øyeblikket er et ufullstendig kall til printf (det vet ikke hvor det er akkurat nå).
Når det gjelder mylib.a
, det skjer mer her. Filen du har er et arkiv; den inneholder flere objektfiler, hver med sitt eget tekstsegment. Som et eksempel, her er en del av en nm mot /usr/lib/libm.a på boksen min her
e_sinh.o: 0000000000000000 r .LC0 0000000000000008 r .LC1 0000000000000010 r .LC2 0000000000000018 r .LC3 0000000000000000 r .LC4 U __expm1 U __ieee754_exp 0000000000000000 T __ieee754_sinh e_sqrt.o: 0000000000000000 T __ieee754_sqrt e_gamma_r.o: 0000000000000000 r .LC0 U __ieee754_exp 0000000000000000 T __ieee754_gamma_r U __ieee754_lgamma_r U __rint
Du vil se at flere tekstsegmentoppføringer -- angitt med T i den andre kolonnen hviler på adressen 0x0, men hver enkelt fil har bare ett tekstsegmentsymbol ved 0x0.
Når det gjelder individuelle filer som har flere symboler som hviler på samme adresse, ser det ut til at det ville være mulig kanskje. Tross alt er det bare en oppføring i en tabell som brukes til å bestemme plasseringen og størrelsen på en del av data. Men jeg vet ikke sikkert. Jeg har aldri sett flere symboler som refererer til den samme delen av en seksjon før. Alle som har mer kunnskap om dette enn meg kan ringe. :-)
Håper dette hjelper noen.
Sekskantnummeret er minneforskyvningen til objektfilene der symbolet kan finnes. Det er bokstavelig talt antall byte i objektkoden.
Denne verdien brukes av linkeren for å finne og lage en kopi av symbolets verdi. Du kan se generelt hvordan det er lagt opp hvis du legger til -S
alternativet til nm
, som vil vise deg størrelsen på verdien for hvert symbol.