所以测试平台在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部分找到某些数据的真实内存地址的帮助?
答案 0 :(得分:1)
它以同样的方式完成。您应该看到针对.rodata
的重定位条目,其中.rodata
表示当前目标文件中.rodata
部分的起始地址。
请注意,objdump -dr
可能是更好的工具。