#c #g #shared-libraries
#c #g #общие библиотеки
Вопрос:
У меня есть случай, когда g отказывается загружать библиотеку. У меня есть файл deps/lib/libskgxp11.so. Я помещаю -L deps/lib
и -lskgxp11
в команду g . Я получаю следующую ошибку:
error while loading shared libraries: libskgxp11.so: cannot open shared object file: No such file or directory
Моя общая цель — запустить тест с gtest, который подключается к Oracle, выполняет select * из dual и сравнивает результат.
В Makefile у меня есть следующее:
g -m32 -o $(test_target) -L deps/lib -Wl,--start-group $(dep_libs) -lpthread -ldl -lskgxpr -lskgxp11 -locrb11 -locr11 -lhasgen11 -lnnz11 -lskgxn2 -locrutl11 -lclntsh $(test_objects) -Wl,--end-group
Я использовал ту же базовую последовательность -Wl,—start group , все зависимые статические библиотеки, все зависимые общие библиотеки, все объектные файлы, -Wl,—end-group в других проектах, и это работает просто отлично.
Обратите внимание на -m32, сейчас мы делаем все в 32 битах. Все остальные разделяемые библиотеки загружаются нормально и находятся в одном каталоге:
ls deps/lib/libskgxpr.so deps/lib/libskgxp11.so deps/lib/libocrb11.so deps/lib/libocr11.so deps/lib/libhasgen11.so deps/lib/libnnz11.so deps/lib/libskgxn2.so deps/lib/libocrutl11.so deps/lib/libclntsh.so | cat
deps/lib/libclntsh.so
deps/lib/libhasgen11.so
deps/lib/libnnz11.so
deps/lib/libocr11.so
deps/lib/libocrb11.so
deps/lib/libocrutl11.so
deps/lib/libskgxn2.so
deps/lib/libskgxp11.so
deps/lib/libskgxpr.so
Я замечаю одну странную вещь, кажется, что следующая группа библиотек каким-то образом связана:
deps/lib/libskgxp11.so
deps/lib/libskgxpcompat.so
deps/lib/libskgxpd.so
deps/lib/libskgxpg.so
deps/lib/libskgxpr.so
Кажется, что каждый из них определяет одни и те же функции. Остальные 4, похоже, зависят от libskgxp11, в том смысле, что если я свяжу любой из остальных 4 отдельно с опцией -l, g жалуется, что не может загрузить libskgxp11.
У меня есть последовательность команд, которая может указать мне для каждой оставшейся функции, которую мне нужно получить из некоторой общей библиотеки, какие общие библиотеки содержат ее. Это дает следующее:
skgxpcdel
deps/lib/libskgxp11.so
deps/lib/libskgxpcompat.so
deps/lib/libskgxpd.so
deps/lib/libskgxpg.so
deps/lib/libskgxpr.so
skgxpcini_with_stats
deps/lib/libskgxp11.so
deps/lib/libskgxpcompat.so
deps/lib/libskgxpd.so
deps/lib/libskgxpg.so
deps/lib/libskgxpr.so
skgxpcon_with_stats
deps/lib/libskgxp11.so
deps/lib/libskgxpcompat.so
deps/lib/libskgxpd.so
deps/lib/libskgxpg.so
deps/lib/libskgxpr.so
...
где skgxpcdel — это функция, которую я ищу. Все выдающиеся функции, которые мне нужны, дают один и тот же список из тех же 5 библиотек.
Если я запускаю objdump -T для 5 библиотек, все они кажутся 32-разрядными разделяемыми библиотеками, я не вижу ничего особенного в той, которая не загружается, по сравнению с теми, которые загружаются:
for i in deps/lib/libskgxp11.so deps/lib/libskgxpcompat.so deps/lib/libskgxpd.so deps/lib/libskgxpg.so deps/lib/libskgxpr.so; do objdump -T $i | head; done
deps/lib/libskgxp11.so: file format elf32-i386
DYNAMIC SYMBOL TABLE:
0000380c l d .init 00000000 .init
00003b90 l d .text 00000000 .text
00008cc4 l d text.unlikely 00000000 text.unlikely
000a719c l d .fini 00000000 .fini
000a71c0 l d .rodata 00000000 .rodata
000bbe80 l d .eh_frame 00000000 .eh_frame
deps/lib/libskgxpcompat.so: file format elf32-i386
DYNAMIC SYMBOL TABLE:
00000ca0 l d .init 00000000 .init
00000d18 l d .text 00000000 .text
00000e04 l d text.unlikely 00000000 text.unlikely
00001618 l d .fini 00000000 .fini
00001640 l d .rodata 00000000 .rodata
0000188c l d .eh_frame 00000000 .eh_frame
deps/lib/libskgxpd.so: file format elf32-i386
DYNAMIC SYMBOL TABLE:
00000ca0 l d .init 00000000 .init
00000d18 l d .text 00000000 .text
00000e04 l d text.unlikely 00000000 text.unlikely
00001618 l d .fini 00000000 .fini
00001640 l d .rodata 00000000 .rodata
0000188c l d .eh_frame 00000000 .eh_frame
deps/lib/libskgxpg.so: file format elf32-i386
DYNAMIC SYMBOL TABLE:
0000380c l d .init 00000000 .init
00003b90 l d .text 00000000 .text
00008cc4 l d text.unlikely 00000000 text.unlikely
000a719c l d .fini 00000000 .fini
000a71c0 l d .rodata 00000000 .rodata
000bbe80 l d .eh_frame 00000000 .eh_frame
deps/lib/libskgxpr.so: file format elf32-i386
DYNAMIC SYMBOL TABLE:
0000380c l d .init 00000000 .init
00003b90 l d .text 00000000 .text
00008cc4 l d text.unlikely 00000000 text.unlikely
000a719c l d .fini 00000000 .fini
000a71c0 l d .rodata 00000000 .rodata
000bbe80 l d .eh_frame 00000000 .eh_frame
Я ломаю голову, задаваясь вопросом, почему я не могу связать libskgxp11.so , и какова взаимосвязь между этой группой из 5 библиотек.
Любая помощь будет с благодарностью принята.
Для справки, вот некоторые последовательности команд, которые я запустил, чтобы получить список проблемных функций и отследить библиотеки:
# Get what project needs
make run-tests 2>amp;1 | grep -Po '(?<=undefined reference to ).*' | tr -d "`'" | sort -u > undefined.txt
# Complete content of undefined.txt
skgxpcdel
skgxpcini_with_stats
skgxpcon_with_stats
skgxpdis
skgxpdmpctx
skgxpdmpobj
skgxp_get_epid
skgxpgettabledef
skgxpmmap
skgxpnetmappush
skgxppost
skgxprqhi
skgxpsz
skgxptrace
skgxpunmap
skgxpveri
skgxpvrpc
skgxpwait
# Get what deps provide, for comparison to what project needs
(for i in deps/lib/*.so;do objdump -TC $i | grep -E '^...............F';done) | grep -v '[*]UND[*]' | awk '{print $NF}' | sort -u > have.txt
# First few lines of have.txt
_A_BSafeError
AddCRLBerToList
add_error_table
afidrv
AHChooseRandomConstructor2
AHSecretCBCConstructor2
AHSecretCBCPadConstructor2
AI_AES_CBC
# See what is common between what project needs and what deps provide
comm -12 have.txt undefined.txt > left.txt
# A diff of undefined.txt and left.txt indicates they are identical
# Get what deps provide, in a way searchable by a person
(for i in deps/lib/*.so;do echo "====$i"; objdump -TC $i | grep -E '^...............F';done) | grep -v '[*]UND[*]' | awk '{print $NF}' > have-files.txt
# Here's a sample of first two shared libs and some of their funcs, from have-files.txt
====deps/lib/libagfw11.so
clsagfw_get_check_type
clsagfw_exit
clsagfw_get_attrvalue
====deps/lib/libagtsh.so
naecsn
lmsapbn
kokogtv
# for each func left, try to find lib that contains it
(for i in `cat left.txt`;do echo $i; for j in deps/lib/*.so;do (objdump -TC $j | grep -E '^...............F' | grep -v '[*]UND[*]' | grep -q $i) amp;amp; echo " $j"; done; done) 2>amp;1 | more
# Output for first two missing funcs:
skgxpcdel
deps/lib/libskgxp11.so
deps/lib/libskgxpcompat.so
deps/lib/libskgxpd.so
deps/lib/libskgxpg.so
deps/lib/libskgxpr.so
skgxpcini_with_stats
deps/lib/libskgxp11.so
deps/lib/libskgxpcompat.so
deps/lib/libskgxpd.so
deps/lib/libskgxpg.so
deps/lib/libskgxpr.so
Комментарии:
1. Похоже, это сообщение об ошибке не исходит от gcc. Вы получаете это при попытке запустить свою программу?
2. Если это ошибка времени выполнения, похоже, что приложение не может найти библиотеку. Попробуйте установить
LD_LIBRARY_PATH
3. Тьфу. Я пропустил тот факт, что Make нормально строился, и жалуется при его запуске. Я буду работать над LD_LIBRARY_PATH .
4. Да, это работает в том смысле, что теперь я получаю сообщение об ошибке oracle при подключении при запуске.
Ответ №1:
Как любезно предложено в комментариях, проблема возникла при попытке запустить программу. Мне просто нужно было использовать команду env, чтобы задать LD_LIBRARY_PATH для включения каталога deps / lib, в котором хранятся все общие библиотеки:
run-tests: $(test_target)
env "LD_LIBRARY_PATH=deps/lib:$LD_LIBRARY_PATH" $(test_target)
Спасибо.