“代码中未使用RTLD_NEXTdynamic加载”请帮忙

我已经使用dlsym在efence代码中创build一个malloc / calloc包装器,以便能够访问libc malloc(除了efence malloc / calloc之外偶尔也是如此)。 现在当我连接它,并运行,它会给出以下错误:“代码中使用RTLD_NEXT不dynamic加载”

bash-3.2# /tool/devel/usr/bin/gcc -g -L/tool/devel/usr/lib/ efence_time_interval_measurement_test.c -o dev.out -lefence -ldl -lpthread bash-3.2# export LD_LIBRARY_PATH=/tool/devel/usr/lib/ bash-3.2# ./dev.out eFence: could not resolve 'calloc' in 'libc.so': RTLD_NEXT used in code not dynamically loaded 

现在,如果我使用“libefence.a”,就会发生这样的情况:

 bash-3.2# /tool/devel/usr/bin/gcc -g -L/tool/devel/usr/lib/ -static efence_time_interval_measurement_test.c -o dev.out -lefence -ldl -lpthread /tool/devel/usr/lib//libefence.a(page.o): In function `stringErrorReport': /home/raj/eFence/BUILD/electric-fence-2.1.13/page.c:50: warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead /home/raj/eFence/BUILD/electric-fence-2.1.13/page.c:50: warning: `sys_nerr' is deprecated; use `strerror' or `strerror_r' instead /tool/devel/usr/lib//libc.a(malloc.o): In function `__libc_free': /home/rpmuser/rpmdir/BUILD/glibc-2.9/malloc/malloc.c:3595: multiple definition of `free' /tool/devel/usr/lib//libefence.a(efence.o):/home/raj/eFence/BUILD/electric-fence-2.1.13/efence.c:790: first defined here /tool/devel/usr/lib//libc.a(malloc.o): In function `__libc_malloc': /home/rpmuser/rpmdir/BUILD/glibc-2.9/malloc/malloc.c:3551: multiple definition of `malloc' /tool/devel/usr/lib//libefence.a(efence.o):/home/raj/eFence/BUILD/electric-fence-2.1.13/efence.c:994: first defined here /tool/devel/usr/lib//libc.a(malloc.o): In function `__libc_realloc': /home/rpmuser/rpmdir/BUILD/glibc-2.9/malloc/malloc.c:3647: multiple definition of `realloc' /tool/devel/usr/lib//libefence.a(efence.o):/home/raj/eFence/BUILD/electric-fence-2.1.13/efence.c:916: first defined here 

请帮帮我。 链接有问题吗?

没有人在堆叠溢出谁可以解决这个问题

问题是你的问题,而不是与我们;-)

首先, efence很可能是在Linux系统上使用的错误工具。 对于大多数可以发现的错误,Valgrind可以更准确地找到它们并将它们描述给您(以便您可以修复它们)。 如果您的应用程序运行了很长时间,Valgrind运行速度太慢,您唯一的理由是使用efence

其次, efence并不打算使用静态链接,所以使用-static标志得到的错误并不令人意外。

最后,你没有告诉我们你的系统上安装了什么libc (在/lib ),什么库存在于/tool/devel/usr/lib/ 。 / usr / devel / usr / lib中存在libc.so.6,而且其版本与/ lib中安装的版本不匹配。

这将解释RTLD_NEXT used in code not dynamically loadedRTLD_NEXT used in code not dynamically loaded错误。 问题是glibc由多个二进制文件组成, 所有二进制文件必须完全匹配 。 如果系统安装了libc-2.7,那么你使用glibc-2.7中的/lib/ld-linux.so.2(动态加载器被硬编码到每个可执行文件中,不受环境变量的影响)它与来自glibc-2.9的libc.so.6。 这样做的通常结果是一个SIGSEGV ,奇怪的未解决的符号错误,以及其他没有意义的错误。