我有一个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
上运行gdb,gdb libdtest1.so
在gdb中,libdtest2.so的符号没有被加载。因此,我无法进入dtestfunc1,如果我按s,函数就会执行并退出。
如果我创建一个驱动程序,在共享库上调用dlopen,那么在执行dlopen后,gdb会正确加载符号,一切正常。
- 为什么gdb在这两种情况下的行为不同?
- 如果我直接在共享库上运行gdb,如何手动指向共享库?
注意:这只是一个玩具示例,反映了我在一个更大的共享库中遇到的问题。所有的二进制文件和库都使用-ggdb3标志编译。
编辑:我的共享库是可运行的。我在源代码中使用extern定义添加了适当的解释器路径。我使用gcc -ggdb3 -O0 -shared -Wl,-soname,libdtest1.so.1 -ldtest2 -L/usr/lib -Wl,-e,main -o libdtest1.so.1.0 dtest1.o
编译它。我可以运行它,并且它能够完美地执行。在这里,运行共享库不是问题所在。