【发布时间】:2018-12-15 06:57:53
【问题描述】:
假设我有一个名为 library.c 的文件
#include <stdio.h>
void someFunc(int n)
{
printf("%s: %d\n", LIBNAME, n);
}
我使用不同的宏将它编译成两个共享对象文件(因此生成的代码不同)。在这个例子中,我提供了不同的 LIBNAME:
gcc -DLIBNAME=\"lib1\" -fPIC -shared -g -Og library.c -o library1.so
gcc -DLIBNAME=\"lib2\" -fPIC -shared -g -Og library.c -o library2.so
然后我从可执行文件中加载两个库:
#include <dlfcn.h>
#include <stdio.h>
typedef void (*functype)(int);
int callFunc(const char* libname, int n)
{
void* lib = dlopen(libname, RTLD_NOW|RTLD_LOCAL);
if (!lib) {
fprintf(stderr, "%s\n", dlerror());
return -1;
}
functype func = dlsym(lib, "someFunc");
if (!func) {
fprintf(stderr, "%s\n", dlerror());
dlclose(lib);
return -1;
}
func(n);
dlclose(lib);
return 0;
}
int main()
{
int res = callFunc("./library1.so", 42);
if (res == 0)
return callFunc("./library2.so", 13);
else
return res;
}
在 gdb 中,我想调试某个库(例如 library1.so)中的函数,而不必担心另一个库(library2.so)。我不能按函数名设置断点,因为它在两个库中都是一样的。我也不能用 sourcefile:linenumber 来做,因为两个库的源文件是相同的。如何让 gdb 只在一个库中设置断点?
【问题讨论】:
标签: c gdb shared-libraries dlopen