2016-06-21 14 views
1

Ich habe die folgenden Beispielcode. Ich würde gerne die Einträge der Verschiebungstabelle aus der Objektdatei sehen. Dazu habe ichUmzug Eintrag wird nicht angezeigt in objdump Ausgabe des angegebenen Beispielprogramm

objdump -r test.o 

Beispielcode verwendet:

#include <stdio.h> 
char * myfunction(); 
int x=20; 
int main() 
{ 

    printf (" \n Inside main "); 
    char * p = myfunction(); 
    printf (" \n My string is %s ", p); 
} 

char * myfunction() 
{ 
    char * key ="jaka"; 
    return key; 
} 

Outputof objdump -r test.o

test.o:  file format elf64-x86-64 

RELOCATION RECORDS FOR [.text]: 
OFFSET   TYPE    VALUE 
0000000000000009 R_X86_64_32  .rodata 
0000000000000013 R_X86_64_PC32  printf-0x0000000000000004 
000000000000001d R_X86_64_PC32  myfunction-0x0000000000000004 
000000000000002d R_X86_64_32  .rodata+0x0000000000000010 
0000000000000037 R_X86_64_PC32  printf-0x0000000000000004 
0000000000000045 R_X86_64_32S  .rodata+0x0000000000000024 


RELOCATION RECORDS FOR [.eh_frame]: 
OFFSET   TYPE    VALUE 
0000000000000020 R_X86_64_PC32  .text 
0000000000000040 R_X86_64_PC32  .text+0x000000000000003d 

FRAGE

:

Nach meinem Verständnis der Die globale Variable 'x' sollte in der Umlagerungstabelle enthalten sein wo, was ich nicht finden kann.

Bitte helfen Sie mir, wenn ich hier etwas übersehen habe?

Antwort

2

Es sollte keine Umzugseinträge geben, die sich auf x beziehen, da Ihr Code sie nicht verwendet. Nichtsdestotrotz präsentiert es in der Symboltabelle, und Sie können es mit objdump -t

In wenigen Worten sagen - Umzug Eintrag ist die Sache, die Ihren Code hilft, auf ein Objekt verweisen, um gegen sie zu verknüpfen. Wenn Sie also in Ihrem Code nicht auf x verweisen, werden keine gezielten Standortverlagerungen vorgenommen.

es zu überprüfen - hinzufügen, zum Beispiel x = 40; im main() und Sie werden die nächste erhalten:

test.o:  file format elf64-x86-64 

RELOCATION RECORDS FOR [.text]: 
OFFSET   TYPE    VALUE 
0000000000000009 R_X86_64_32  .rodata 
0000000000000013 R_X86_64_PC32  printf-0x0000000000000004 
000000000000001d R_X86_64_PC32  myfunction-0x0000000000000004 
000000000000002d R_X86_64_32  .rodata+0x0000000000000010 
0000000000000037 R_X86_64_PC32  printf-0x0000000000000004 
000000000000003d R_X86_64_PC32  x-0x0000000000000008   # bingo! 
000000000000004f R_X86_64_32S  .rodata+0x0000000000000024 


RELOCATION RECORDS FOR [.eh_frame]: 
OFFSET   TYPE    VALUE 
0000000000000020 R_X86_64_PC32  .text 
0000000000000040 R_X86_64_PC32  .text+0x0000000000000047