glibc版本早于gcc版本和-Wl,-rpath不起作用

时间:2017-08-04 18:01:12

标签: c++ linux gcc glibc

我正在为armhf进行交叉编译,编译过程进展顺利,但GLIBC版本已经过时了, ./ libc.so.6 显示它是由gcc 4.6.3编译的,遗憾的是我在apt-get.so上找不到这个旧版本。我试图通过使用跟随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, - 动态接头,/拳击手/ 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,有什么不同?

1 个答案:

答案 0 :(得分:0)

  

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

显示了实际加载的库。