我正在尝试使用dlcfn.h
中的函数,从我的C应用程序中打印自定义跟踪。
我确实链接了-ldl
,但链接器却抱怨找不到dladdr()
。
我错过了什么?
下面是一个示例inst.c
:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
__attribute__((no_instrument_function))
void __cyg_profile_func_enter (void *this_fn, void *call_site) {
printf("%p\n", this_fn);
Dl_info info;
if (dladdr(this_fn, &info)) {
printf("%p [%s] %s\n",
this_fn,
info.dli_fname ? info.dli_fname : "?",
info.dli_sname ? info.dli_sname : "?");
}
}
__attribute__((no_instrument_function))
void __cyg_profile_func_exit (void *this_fn, void *call_site) {
}
void my_function_b(void)
{
printf("b!\n");
}
void my_function_a(void)
{
printf("a!\n");
my_function_b();
}
int main(void)
{
my_function_a();
my_function_b();
return 0;
}
和一个Makefile:
CFLAGS += -O0 -g -finstrument-functions -rdynamic -ldl
inst: inst.c
gcc $(CFLAGS) $^ -o $@
结果:
$ make
gcc -O0 -g -finstrument-functions -ldl inst.c -o inst
/usr/bin/ld: /tmp/ccKL1sh2.o: in function `__cyg_profile_func_enter':
/home/gauthier/tmp/inst/inst.c:12: undefined reference to `dladdr'
collect2: error: ld returned 1 exit status
make: *** [Makefile:4: inst] Error 1
1条答案
按热度按时间wydwbb8l1#
您应该将库放在导入其函数的源文件或目标文件 * 之后 *,否则链接器会优化它们: