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

时间:2015-11-16 20:59:35

标签: 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

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 ) )
        ^^^^^          ^^^^^^^^^                              ^^^^^^^^^

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 )
        ^^^^^^^^                 ^^^^^^^^^

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

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

问题:

  1. 这些脚本用于什么?

  2. 为什么其中一些路径有硬编码路径(libc.solibpthread.so)但有些路径(libgcc_s.so)?

  3. 更新

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

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

0 个答案:

没有答案