GDB 跳过动态加载器代码

问题描述 投票:0回答:1

我正在编写一个自定义动态加载器,一件奇怪的事情是,当我尝试在 .interp 部分中指定动态加载器的可执行文件上运行 GDB 时,我似乎无法在动态加载器中设置断点代码。流程大致是这样的:

$ gdb ./a
Reading symbols from ./a...
(gdb) b ld_stage1_entry
Function "ld_stage1_entry" not defined.
Make breakpoint pending on future shared library load? (y or [n]) 

动态加载器使用

-g
标志进行编译,正常运行时它会成功执行其操作。

我假设这里的问题是 GDB 不知何故没有从动态加载器中读取符号(毕竟我是说我正在调试

./a
可执行文件)。我的问题是,有没有办法告诉 GDB 在调试时查找动态加载器符号,或者至少有某种方法单步执行动态加载器代码?

我知道调试动态加载器的一种方法是将其作为可执行文件运行,传递程序作为参数运行,如下所示:

gdb ./ld.so ./a

但是在这个过程中,一些早期阶段的细节是不同的,我理想地希望有一种方法来调试它,它将由

.interp
部分的 linux 运行。


编辑:您可以尝试使用 glibc 重现它,但 glibc 无论如何都不为其动态加载器提供调试符号,所以我不希望任何人能够调试它。要重现,您可以从 github 克隆我的动态加载器并使用以下命令编译示例:

./build.py --ld -t tests/hello.c
动态加载器的位置位于

lib

文件夹中。 
./a
 文件应位于 
ciabatta
 文件夹中。

c linux gdb dynamic-loading
1个回答
0
投票
我假设这里的问题是 GDB 不知何故不读取符号

有点。问题是 GDB 不知道

任何动态加载的代码——动态加载器本身会通知它有关此类加载的信息。

您想要做的是使用

starti

 命令,该命令应在第一个用户空间指令处停止。对于动态链接程序,这将是动态加载器中的 
start
 符号。从那里您应该能够设置您想要的任何断点。

© www.soinside.com 2019 - 2024. All rights reserved.