据我了解,该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,如果它完全相关的话
我将不胜感激任何帮助 :)