2016-06-21 4 views
1

私は以下のサンプルコードを持っています。私は、オブジェクトファイルから再配置テーブルのエントリを見たいと思います。このために、私が使用している指定サンプルプログラムのobjdump出力に再配置エントリが表示されない

objdump -r test.o 

サンプルコード: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 

QUESTION -r

#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は:私の理解によると

グローバル変数 'x'は再配置テーブルにあったはずです。どこで見つけることができません。

私はここで何か見落としても助けてください?

答えて

2

xに関連する再配置エントリは、コードで使用されていないため存在しないはずです。それにもかかわらず、それはシンボルテーブルに表示され、あなたはそれをチェックすることができますobjdump -t

いくつかの言葉で言って - 再配置エントリは、あなたのコードがいくつかのオブジェクトを参照して、それらにリンクするのを助けるものです。したがって、あなたのコードでxを参照しない場合は、x対象の再配置はありません。

それを確認するには - 、例えば、main()x = 40;を追加し、次を取得します:

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 
関連する問題