«RTLD_NEXT используется в коде, который не загружается динамически». Пожалуйста, помогите - PullRequest
2 голосов
/ 22 июля 2011

Я использовал dlsym, чтобы создать оболочку malloc / calloc в коде efence, чтобы иметь возможность доступа к malloc libc (иногда кроме 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 Ответ

2 голосов
/ 23 июля 2011

НЕТ ОДНОГО В СТЕКЕ ПЕРЕХОДА, КТО МОЖЕТ РЕШИТЬ ЭТОТ

Проблема в вашем вопросе, а не в нас; -)

Прежде всего, 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 вы используете /lib/ld-linux.so.2 из glibc-2.7 (динамический загрузчик жестко запрограммирован в каждом исполняемом файле и не зависит от переменных среды) и смешивает его с libc.so .6 из glibc-2.9. Обычный результат этого - SIGSEGV, странные неразрешенные ошибки символов и другие ошибки, которые не имеют смысла.

...