gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:32:20 24 4
gpt4 key购买 nike

所以测试平台是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”替换为真实地址打印,

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

关于链接器如何找到 .rodata 部分中某些数据的真实内存地址,谁能帮我一些忙吗?

最佳答案

同理。您应该看到针对 .rodata 的重定位条目,其中 .rodata 表示当前对象中 .rodata 部分的起始地址文件。

请注意,objdump -dr 可能是完成这项工作的更好工具。

关于c - 链接器如何确定 .rodata 部分中某些数据的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23088850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com