无法将dlfcn函数与gcc和-ldl链接

mlnl4t2r  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(153)

我正在尝试使用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
wydwbb8l

wydwbb8l1#

您应该将库放在导入其函数的源文件或目标文件 * 之后 *,否则链接器会优化它们:

gcc -O0 -g -finstrument-functions inst.c -ldl -o inst

相关问题