我正在尝试为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
),其中也有硬编码路径,但都是正确的。
问题:
这些脚本用于什么?
为什么其中一些路径有硬编码路径(libc.so
,libpthread.so
)但有些路径(libgcc_s.so
)?
更新
我从棋盘上复制的rootfs是Yocto发行版。
我使用的主机是Ubuntu14.04 LTS x86-64。