【发布时间】:2015-06-19 20:27:18
【问题描述】:
我有一个 PIC 共享库,它也有一个 main 函数
#include <dtest2.h>
#include <stdio.h>
extern const char elf_interpreter[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
int dtestfunc1(int x,int y) {
int i=0;
int sum = 0;
for(i=0;i<=x;i++) {
sum+=y;
sum+=dtestfunc2(x,y);
}
return sum;
}
int main (int argc, char const* argv[])
{
printf("starting sharedlib main\n");
int val = dtestfunc1(4,5);
printf("val = %d\n",val);
_exit(0);
}
此库链接到另一个共享库 libdtest2,该共享库具有从 dtestfunc1 调用的 dtestfunc2 的实现。
如果我使用
直接在 dtestfunc1 上运行 gdbgdb libdtest1.so
gdb 不加载 libdtest2.so 的符号。因此我无法进入dtestfunc1,如果我按 s,函数就会执行并退出。
如果我在共享库上创建一个调用 dlopen 的驱动程序,gdb 会在 dlopen 执行后正确加载符号并且一切正常。
- 为什么 gdb 在这两种情况下表现不同?
- 如果我直接在共享库上运行 gdb,如何手动将 gdb 指向共享库?
注意:这是一个玩具示例,它反映了我在更大的共享库中遇到的问题。我所有的二进制文件和库都使用 -ggdb3 标志编译。
编辑:我的共享库是可运行的。我使用源代码中的外部定义添加了正确的解释器路径。我用gcc -ggdb3 -O0 -shared -Wl,-soname,libdtest1.so.1 -ldtest2 -L/usr/lib -Wl,-e,main -o libdtest1.so.1.0 dtest1.o 编译它。
我可以运行它并且它完美地执行。运行共享库不是这里的问题。
【问题讨论】:
-
我的 gdb 生锈了,但是是
file命令会手动执行此操作(问题 #2)。如果是这样,您可以使用.gdbinit文件来简化操作。
标签: c linux gdb shared-libraries