.so 脚本用于什么以及为什么其中一些具有硬编码依赖项?

use*_*438 5 linux gcc ld

我正在尝试为 ARM 板设置交叉编译软件项目。

该板的 rootfs 中有一些不在主机中的库。因此,为了确保链接器可以链接到它们,我将 rootfs 复制到本地目录并用于-Wl,-rpath-link=${Target}将链接器指向它。

问题:

ld 找不到 glibc。

分析:

使用-Wl,--verbose选项,ld显示:

opened script file {Target}/usr/lib/libpthread.so

opened script file {Target}/usr/lib/libc.so
Run Code Online (Sandbox Code Playgroud)

libc.so:

    /* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /usr/lib/ld-linux-armhf.so.3 ) )
        ^^^^^          ^^^^^^^^^                              ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

libpthread.so

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf32-littlearm)
GROUP ( /usr/lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a )
        ^^^^^^^^                 ^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

因此,当我指向ld从板的 rootfs 复制的库时,它将从那里打开这两个脚本,它们具有硬编码的依赖关系。

但是,如果我不使用-rpathld则将使用交叉编译器(/usr/arm-linux-gnueabihf/lib/libpthread.so/usr/arm-linux-gnueabihf/lib/libc.so)附带的脚本,其中也有硬编码路径,但都是正确的。

题:

  1. 这些脚本是干什么用的?

  2. 为什么其中一些具有硬编码路径(libc.solibpthread.so),而有些则没有(libgcc_s.so)?

更新:

我从板上复制的 rootfs 是 Yocto 发行版。

我使用的主机是 Ubuntu14.04 LTS x86-64。