我已经使用dlsym在efence代码中创建了一个malloc/calloc包装器,以便能够访问libc malloc(有时与efence malloc/calloc无关)。现在,当我链接它并运行时,它给出以下错误:“RTLD_NEXT用于未动态加载的代码中”
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系统上使用的错误工具。对于efence
可以找到的大多数错误,Valgrind可以找到它们并向您描述它们(以便您对其进行修复),从而更加准确。您使用efence
的唯一好理由是,如果您的应用程序运行了多个小时,并且Valgrind太慢。
其次,efence
不适用于静态链接,因此-static
标志所导致的错误一点也不令人惊讶。
最后,您没有告诉我们系统上安装了什么libc
(在/lib
中),以及/tool/devel/usr/lib/
中存在哪些库。在/usr/devel/usr/lib中很可能存在libc.so.6,并且其版本与/lib中安装的版本不匹配。
那将解释RTLD_NEXT used in code not dynamically loaded
错误。问题在于glibc由多个二进制文件组成,所有二进制文件必须完全匹配。如果系统有安装libc-2.7,然后使用glibc-2.7中的/lib/ld-linux.so.2(动态加载器被硬编码到每个可执行文件中,并且不受环境变量的影响),并将其与libc.so混合.6来自glibc-2.9。这样做的通常结果是SIGSEGV
,奇怪的未解决符号错误以及其他没有意义的错误。
关于c - “RTLD_NEXT used in code not dynamically loaded”请帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6791065/