Hva betyr symbolverdi fra nm-kommando?

 C Programming >> C C# Program >  >> C++
Hva betyr symbolverdi fra nm-kommando?

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.