【问题标题】:glibc version older than gcc version and -Wl,-rpath not workglibc 版本早于 gcc 版本和 -Wl,-rpath 不起作用
【发布时间】:2018-01-12 18:08:14
【问题描述】:

我正在为armhf进行交叉编译,编译过程很顺利,但是GLIBC版本太旧了,./libc.so.6显示它是由gcc 4.6.3编译的,不幸的是我在 apt-get 上找不到这个旧版本。所以我尝试使用 follow LDFLAG 选项重新定位 lib 路径。

-Wl,-rpath,/boxer/lib -Wl,--dynamic-linker,/boxer/lib/ld-linux-armhf.so.3

并将对应的库部署到/boxer/lib,但问题没有解决,./ld-linux-armhf.so.3 --list显示ld链接正确地方,但是,正如你在下面看到的,其余的都没有。

root@cubieboard2:/lib/arm-linux-gnueabihf# ./ld-linux-armhf.so.3 --list /boxer/frida-server
/boxer/frida-server: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.17' not found (required by /boxer/frida-server)
        libresolv.so.2 => /lib/arm-linux-gnueabihf/libresolv.so.2 (0xb6f7a000)
        libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6f6e000)
        libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6f53000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e6f000)
        /boxer/lib/ld-linux-armhf.so.3 => ./ld-linux-armhf.so.3 (0xb6f9e000)

有什么建议吗?谢谢。

更新:

这里是LD_TRACE_LOADED_OBJECTS=1选项结果,好像和上面一样

root@cubieboard2:/boxer# LD_TRACE_LOADED_OBJECTS=1 /boxer/frida-server
/boxer/frida-server: /lib/arm-linux-gnueabihf/libc.so.6: version `GLIBC_2.17' not found (required by /boxer/frida-server)
        libresolv.so.2 => /lib/arm-linux-gnueabihf/libresolv.so.2 (0xb6f10000)
        libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6f05000)
        libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6eea000)
        libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6e06000)
        /boxer/lib/ld-linux-armhf.so.3 (0xb6f28000)
root@cubieboard2:/boxer#

ld-linux 有合适的去处,但其他的还在老路上...

这是我之前使用 QT 编译的另一个程序,带有 rpath LDFLAG:

QMAKE_LFLAGS +=-Wl,-rpath,/boxer/lib -Wl,--dynamic-linker,/boxer/lib/ld-linux.so.3

是的,我关注了your answer,它工作正常(谢谢,大帮助 :-)),LD_TRACE_LOADED_OBJECTS=1 结果:

# LD_TRACE_LOADED_OBJECTS=1 /boxer/Boxer
        libdl.so.2 => /boxer/lib/libdl.so.2 (0xb6efb000)
        libQt5Widgets.so.5 => /boxer/lib/libQt5Widgets.so.5 (0xb69b9000)
        libQt5Gui.so.5 => /boxer/lib/libQt5Gui.so.5 (0xb655f000)
        libQt5Network.so.5 => /boxer/lib/libQt5Network.so.5 (0xb646f000)
        libQt5Core.so.5 => /boxer/lib/libQt5Core.so.5 (0xb5f50000)
        libpthread.so.0 => /boxer/lib/libpthread.so.0 (0xb5f27000)
        libstdc++.so.6 => /boxer/lib/libstdc++.so.6 (0xb5ddc000)
        libm.so.6 => /boxer/lib/libm.so.6 (0xb5d2a000)
        libgcc_s.so.1 => /boxer/lib/libgcc_s.so.1 (0xb5cfa000)
        libc.so.6 => /boxer/lib/libc.so.6 (0xb5bb5000)
        /boxer/lib/ld-linux.so.3 (0xb6f0e000)
        librt.so.1 => /boxer/lib/librt.so.1 (0xb5b9e000)

我们可以看到一切顺利,包括 libc,有什么不同?

【问题讨论】:

    标签: c++ linux gcc glibc


    【解决方案1】:

    GLIBC 版本旧,./libc.so.6 显示它是由 gcc 4.6.3 编译的,不幸的是我在 apt-get 上找不到这个旧版本。

    请注意,GLIBC 的版本与编译时所用的 GCC 版本的关系很少。较新版本的 GLIBC 确实需要较新版本的 GCC 来构建它们,但这种关系远非一对一。

    将相应的库部署到/boxer/lib,但问题没有解决,并且./ld-linux-armhf.so.3 --list 显示ld已链接到正确的位置,但是,如您所见下面,其余的没有。

    您需要使用--prefix=/boxerld-linux 构建GLIBC 以查看备用位置。另见this answer

    更新:

    我误解了你的问题。这个命令:

    ./ld-linux-armhf.so.3 --list /boxer/frida-server
    

    告诉你你想知道什么(运行时会加载哪些库),因为它不注意编译到应用程序中的RPATH(它只使用路径编译成ld-linux 本身)。

    相反,你想要:

    LD_TRACE_LOADED_OBJECTS=1 /boxer/frida-server
    

    显示哪些库实际上会被加载。

    【讨论】:

    • 你提到的链接已经被阅读,我在我的案例上试过,你可以看到,但它对我不起作用,我的编译选项有问题?我不会构建 GLIBC我自己,只需使用我正在使用的编译器库。
    • 正如你在this answer 上所说,选项-Wl,-rpath,/boxer/lib -Wl,--dynamic-linker,/boxer/lib/ld-linux-armhf.so.3 意味着让运行时加载程序搜索/boxer/lib 中的库并“烘焙”/boxer /lib/ld-linux-armhf.so.3 将 ld-linux.so.2 更正到应用程序中。我误解了吗?
    猜你喜欢
    • 2012-05-14
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2020-12-07
    • 2022-10-25
    • 1970-01-01
    • 2012-06-01
    相关资源
    最近更新 更多