GDB“section”命令似乎没有按预期工作

GDB“section”命令似乎没有按预期工作

据我了解,该section命令可用于告知gdb目标文件的特定部分已加载到特定地址。根据我的理解,这还应该需要将该部分中的所有符号重新定位到新地址(否则,有什么意义?)

然而,它似乎并没有这样做。让我们用一个虚拟程序来展示它a.c

void func(void)
{
}

int main()
{
}

gcc -g a.c 使用then 进行编译gdb ./a.out

(gdb) pipe info files | grep .text
    0x0000000000001040 - 0x0000000000001143 is .text

(gdb) mt info sections .text
Exec file: `/******/a.out', file type elf64-x86-64.
 [13]     0x00001040->0x00001143 at 0x00001040: .text ALLOC LOAD READONLY CODE HAS_CONTENTS

(gdb) info address func
Symbol "func" is a function at address 0x1129.

(gdb) info symbol 0x1129
func in section .text

(gdb) section .text 0x100000
------
    0x0000000000100000 - 0x0000000000100103 is .text
------

# However:
(gdb) mt info sections .text
Exec file: `/*******/a.out', file type elf64-x86-64.
 [13]     0x00001040->0x00001143 at 0x00001040: .text ALLOC LOAD READONLY CODE HAS_CONTENTS

# Calculate relocated address 
(gdb) p/x 0x1129-0x1040+0x100000
$1 = 0x1000e9

(gdb) info symbol 0x1000e9
No symbol matches 0x1000e9.

(gdb) info address func
Symbol "func" is a function at address 0x1129.

这里发生了什么?为什么 的输出mt info sections与 不同info files?为何func保留旧地址?我的section命令实际上做了什么?

顺便说一句,当我使用add-symbol-file ./a.out -s .text 0x100000它时,它对额外的符号文件的作用正是我所期望section的。

gdb在 ubuntu 22.04 机器上使用版本 12.1,如果它完全相关的话

我将不胜感激任何帮助 :)

相关内容