“在动态加载的代码中使用的RTLD_NEXT”请帮忙

时间:2011-07-22 13:54:31

标签: c linux shared-libraries

我已经使用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

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

1 个答案:

答案 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,奇怪的未解决的符号错误,以及其他没有意义的错误。