在给定示例程序的objdump输出中未显示重定位条目

时间:2016-06-21 20:04:32

标签: c linker objdump

我有以下示例代码。我想从目标文件中看到重定位表条目。为此,我使用了

objdump -r test.o

示例代码:

#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;
}

输出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

问题:

根据我的理解,全球变量&#39; x&#39;应该在某个地方的搬迁表中,我无法找到。

如果我在这里忽略某些事情,请帮帮我吗?

1 个答案:

答案 0 :(得分:2)

不应该有与x相关的任何重定位条目,因为您的代码没有使用它。然而,它出现在符号表中,您可以使用objdump -t

进行检查

用几句话说 - 重定位条目是帮助您的代码引用某个对象,链接它们的东西。因此,如果您未在代码中引用x,则不会有任何x目标重定位。

要检查一下 - 例如,在x = 40;中添加main(),您就可以获得下一个:

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