链接器如何确定.rodata部分中某些数据的地址?

时间:2014-04-15 16:00:24

标签: c linux assembly linker elf

所以测试平台在Linux 32位上。

我使用gcc以这种方式生成quickSort的obj文件:

gcc -S quickSort.c

,生成的quickSort.o是可重定位的ELF:

#file quickSort.o    quickSort.o:ELF 32位LSB可重定位,Intel 80386,版本1(SYSV),未剥离

然后我用objdump来反汇编它:

objdump -d quickSort.o

并查看生成的asm文件,我对此感到困惑:

51:   b8 00 00 00 00          mov    $0x0,%eax
56:   89 04 24                mov    %eax,(%esp)
59:   e8 fc ff ff ff          call   5a <main+0x5a>
5e:   c7 44 24 3c 00 00 00    movl   $0x0,0x3c(%esp) 

上面的代码是调用printf函数并打印出一个字符串,如果我将quicksort.c编译成quicksort.s,它应该是这样的:

   movl    $.LC0, %eax
   movl    %eax, (%esp)
   call    printf

因此,通过查看重定位表,我可以很容易地找到“5a”和printf之间的关系,我相信链接器可以使用这种方式重新定位printf并将“fc ff ff ff”替换为真实地址printf的,

但我对如何重新定位.LC0(.rodata部分中的字符串)的地址感到困惑?我在关系表中找不到任何线索(我使用 readelf -r quickSort.o 获得了重定位表)

有没有人能给我一些关于链接器如何在.rodata部分找到某些数据的真实内存地址的帮助?

1 个答案:

答案 0 :(得分:1)

它以同样的方式完成。您应该看到针对.rodata的重定位条目,其中.rodata表示当前目标文件中.rodata部分的起始地址。

请注意,objdump -dr可能是更好的工具。