【问题标题】:version node not found for symbol未找到符号的版本节点
【发布时间】:2018-11-08 08:57:36
【问题描述】:

我在我的桌面上构建了一个共享库,它使用静态链接的 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 库 (-ldl -lm -lc -lpthread -ltinfo -lrt)
  • 静态/共享链接 libc 库

我觉得特别奇怪的是链接器正在寻找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 链接不正确?

链接器命令很长,因为所有共享库,所以我缩短了一点(删除了 boost 和自定义库):

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

有人知道怎么回事吗?如果需要更多信息,请询问。提前致谢!

【问题讨论】:

    标签: linker gstreamer yocto libc


    【解决方案1】:

    有人知道怎么回事吗?

    我怀疑您不是针对 Yocto 的 GLIBC-2.27 进行链接,而是针对其他一些 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开始功能没有改变)?

    是的:这很正常——自 GLIBC-2.17 以来,该函数没有更改其 ABI,所以这是附加到它的版本。

    【讨论】:

    • -Wl, -t 显示:/lib/libc.so.6 (recipe-sysroot/lib/libc.so.6) 所以应该没问题,readelf 正确显示符号:1334: 000000000006e610 56 FUNC GLOBAL DEFAULT 11 _IO_do_write@@GLIBC_2.17 7374: 000000000006e610 56 FUNC LOCAL DEFAULT 11 __GI__IO_do_write 9010: 000000000006e610 56 FUNC GLOBAL DEFAULT 11 _IO_do_write@@GLIBC_2.17 但是我看到它链接到 libc.solibc.a 会不会有问题?
    【解决方案2】:

    我知道出了什么问题。共享库是使用 CMAKE 项目和我们自己编写的 FindGSTREAMER.cmake 构建的。要查找 gstreamer,除其他外,使用 glob 查找所有静态库。因为在我的桌面上,我在其单独的位置安装了 gstreamer,所以它可以工作。然而,对于 Yocto,这会导致 recipe-sysroot/usr/lib 目录中的每个静态库都被链接。包括每个 libc 库(.a_pic.a.so)。显然这会导致链接器无法解析符号。

    正确过滤 gstreamer 所需的库解决了问题。

    【讨论】: