узел версии не найден для символа - PullRequest
0 голосов
/ 08 ноября 2018

Я собрал на своем рабочем столе разделяемую библиотеку, в которой используются статически связанные плагины gstreamer и gstreamer (base, good, rtsp-server).

Сейчас я пытаюсь скомпилировать библиотеку, используя yocto, но она дает мне ошибку компоновщика:

version node not found for symbol _IO_do_write@@GLIBC_2.17
failed to set dynamic section sizes: Bad value

Решения, которые я нашел при переполнении стека, не помогли мне.

  • использовать компилятор с --disable-symvers
  • ссылка libc libs в разных порядках (-ldl -lm -lc -lpthread -ltinfo -lrt)
  • ссылка libc libs статически / совместно используемая

Что мне особенно странно, так это то, что компоновщик ищет GLIBC_2.17, тогда как yocto использует 2.27, а моя система использует 2.24. Я не знаю, имеет ли это значение или это нормально (функция не изменилась с 2.17?).

NM -C показывает символ в libc.a:

nm -C recipe-sysroot/usr/lib/libc.a | grep IO_do_write                                                                                             
                 U _IO_do_write
                 U _IO_do_write
0000000000001ba8 W _IO_do_write

Так я бы подумал, что lib неправильно связан?

Команда компоновщика длинная из-за всех общих библиотек, поэтому я немного ее сократил (удалены бусты и пользовательские библиотеки):

aarch64-poky-linux-g++ -fPIC --sysroot=recipe-sysroot  -O2 -pipe -g -feliminate-unused-debug-types -fdebug-prefix-map=recipe-root/git-r0 -fdebug-prefix-map=recipe-sysroot= -fdebug-prefix-map=recipe-sysroot-native=  -fvisibility-inlines-hidden   --sysroot=recipe-sysroot  -Wl,-allow-multiple-definition -Wall -Wextra -Wpedantic -Wsuggest-override -Wswitch-default -Wduplicated-cond -Wshadow -Werror -ftemplate-depth=1024  -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -lc -Wl,--no-as-needed -Wl,--no-undefined -pthread -ldl -shared -Wl,-soname,rtsp_streamer.so -o rtsp_streamer.so ... custom static libs .and boost static libs ... -lpthread recipe-sysroot/usr/lib/gstreamer-1.0/libgstrtsp.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstrtp.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstrtpmanager.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstcoreelements.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstadder.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstapp.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstaudioconvert.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstaudiorate.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstaudioresample.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstaudiotestsrc.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstgio.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstpango.a recipe-sysroot/usr/lib/gstreamer-1.0/libgsttypefindfunctions.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstvideoconvert.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstvideorate.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstvideoscale.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstvideotestsrc.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstvolume.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstautodetect.a recipe-sysroot/usr/lib/gstreamer-1.0/libgstvideofilter.a recipe-sysroot/usr/lib/libBrokenLocale.a recipe-sysroot/usr/lib/libBrokenLocale_pic.a recipe-sysroot/usr/lib/libanl.a recipe-sysroot/usr/lib/libanl_pic.a recipe-sysroot/usr/lib/libatomic.a recipe-sysroot/usr/lib/libatomic_ops.a recipe-sysroot/usr/lib/libatomic_ops_gpl.a ... more boost static libs ... recipe-sysroot/usr/lib/libc.a recipe-sysroot/usr/lib/libc_nonshared.a recipe-sysroot/usr/lib/libc_pic.a recipe-sysroot/usr/lib/libcidn_pic.a recipe-sysroot/usr/lib/libcrypt.a recipe-sysroot/usr/lib/libcrypt_pic.a recipe-sysroot/usr/lib/libcrypto.a recipe-sysroot/usr/lib/libdl.a recipe-sysroot/usr/lib/libdl_pic.a recipe-sysroot/usr/lib/libg.a recipe-sysroot/usr/lib/libgomp.a recipe-sysroot/usr/lib/libgstallocators-1.0.a recipe-sysroot/usr/lib/libgstaudio-1.0.a recipe-sysroot/usr/lib/libgstbase-1.0.a recipe-sysroot/usr/lib/libgstcheck-1.0.a recipe-sysroot/usr/lib/libgstcontroller-1.0.a recipe-sysroot/usr/lib/libgstfft-1.0.a recipe-sysroot/usr/lib/libgstpbutils-1.0.a recipe-sysroot/usr/lib/libgstreamer-1.0.a recipe-sysroot/usr/lib/libgstriff-1.0.a recipe-sysroot/usr/lib/libgstrtp-1.0.a recipe-sysroot/usr/lib/libgstrtsp-1.0.a recipe-sysroot/usr/lib/libgstrtspserver-1.0.a recipe-sysroot/usr/lib/libgstapp-1.0.a recipe-sysroot/usr/lib/libgstnet-1.0.a recipe-sysroot/usr/lib/libgstsdp-1.0.a recipe-sysroot/usr/lib/libgsttag-1.0.a recipe-sysroot/usr/lib/libgstvideo-1.0.a recipe-sysroot/usr/lib/libhistory.a recipe-sysroot/usr/lib/libitm.a recipe-sysroot/usr/lib/liblicensing.a recipe-sysroot/usr/lib/libm.a recipe-sysroot/usr/lib/libm_pic.a recipe-sysroot/usr/lib/libmcheck.a recipe-sysroot/usr/lib/libncurses++.a recipe-sysroot/usr/lib/libncurses++w.a recipe-sysroot/usr/lib/libnsl.a recipe-sysroot/usr/lib/libnsl_pic.a recipe-sysroot/usr/lib/libnss_compat_pic.a recipe-sysroot/usr/lib/libnss_db_pic.a recipe-sysroot/usr/lib/libnss_dns_pic.a recipe-sysroot/usr/lib/libnss_files_pic.a recipe-sysroot/usr/lib/libnss_hesiod_pic.a recipe-sysroot/usr/lib/libnss_nis_pic.a recipe-sysroot/usr/lib/libnss_nisplus_pic.a recipe-sysroot/usr/lib/libprotobuf-lite.a recipe-sysroot/usr/lib/libprotobuf.a recipe-sysroot/usr/lib/libprotoc.a recipe-sysroot/usr/lib/libpthread.a recipe-sysroot/usr/lib/libpthread_nonshared.a recipe-sysroot/usr/lib/libreadline.a recipe-sysroot/usr/lib/libresolv.a recipe-sysroot/usr/lib/libresolv_pic.a recipe-sysroot/usr/lib/librpcsvc.a recipe-sysroot/usr/lib/librt.a recipe-sysroot/usr/lib/librt_pic.a recipe-sysroot/usr/lib/libsqlite3.a recipe-sysroot/usr/lib/libssl.a recipe-sysroot/usr/lib/libssp.a recipe-sysroot/usr/lib/libssp_nonshared.a recipe-sysroot/usr/lib/libstdc++.a recipe-sysroot/usr/lib/libstdc++fs.a recipe-sysroot/usr/lib/libsupc++.a recipe-sysroot/usr/lib/libthread_db_pic.a recipe-sysroot/usr/lib/libutil.a recipe-sysroot/usr/lib/libutil_pic.a recipe-sysroot/usr/lib/libz.a recipe-sysroot/usr/lib/librt.a recipe-sysroot/usr/lib/libpthread.a recipe-sysroot/usr/lib/libm.a recipe-sysroot/usr/lib/libc.a

Кто-нибудь знает, что не так? Если вам нужна дополнительная информация, пожалуйста, спросите. Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Я понял, что пошло не так. Общая библиотека строится с использованием проекта CMAKE, а наша собственная написана FindGSTREAMER.cmake. Чтобы найти gstreamer, между прочим, глобус используется для поиска всех статических библиотек. Потому что на моем рабочем столе у ​​меня установлен gstreamer в отдельном месте, это работает. Однако при использовании Yocto все статические библиотеки в каталоге recipe-sysroot/usr/lib будут связаны между собой. Включая каждую библиотеку libc (.a, _pic.a и .so). Очевидно, это приводит к тому, что компоновщик не может разрешить символы.

Правильная фильтрация библиотек, необходимых gstreamer, устранила проблему.

0 голосов
/ 10 ноября 2018

Кто-нибудь знает, что не так?

Я подозреваю, что вы связываетесь не с GLIBC-2.27 от Yocto, а с каким-то другим GLIBC, хотя трудно понять, как это могло произойти.

Ваш первый шаг должен выяснить , какой libc.so.6 фактически используется. Вы можете сделать это, добавив флаг -Wl,-t к вашей ссылке. Также добавьте -Wl,-y,_IO_do_write, пока вы на нем.

После того, как вы узнаете, какой libc.so.6 используется, запустите readelf -Ws /path/to/libc.so.6 | grep _IO_do_write, чтобы увидеть, какие (если есть) версионные символы определены в нем.

Я не знаю, имеет ли это значение или это нормально (функция не изменилась с 2.17)?

Да: это нормально - функция не изменила свой ABI начиная с GLIBC-2.17, так что это версия, к которой она прикреплена.

...