我已经使用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
请帮帮我。链接有什么问题吗?
答案 0 :(得分:2)
没有任何一个人可以解决这个问题
问题在于您的问题,而不是我们; - )
首先,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
,奇怪的未解决的符号错误,以及其他没有意义的错误。