3

我正在使用 gcc-linaro-arm-linux-gnueabihf-4.8-2013.07-1_linux 工具在 ubuntu pc 上为 arm 目标进行交叉编译。

如果将目标中的 libc.so 放在库搜索路径中,则链接器会出错:

找不到 /lib/arm-linux-gnueabihf/libc.so.6

如果我删除了这个 libc.so,那么链接过程将完成且没有错误。

似乎 libc.so 库中的绝对路径可能存在符号链接。这就是我收到链接器错误的原因吗?

如果是,有没有办法修改符号链接?

4

1 回答 1

2

我有同样的问题,而且大部分都解决了。

问题是,一些 so 文件不包含可链接代码,但包含 ld 链接器脚本。如果此链接描述文件包含绝对引用,则链接将失败。

我编写了一个小的 perl 脚本,它将所有符号链接转换为相对链接,并将 so 链接器脚本修补为相对路径。

手动操作非常好,自动化过程使用 perl 生成一个 tar 文件 - 无需在树莓文件系统上进行更改。

tar 将在主机上的 sysroot 文件夹中解压缩,所有链接都已修复,所有 so 文件都已修复。

less /lib/arm-linux-gnueabihf/libc.so.6

你会看到:

/* 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/arm-linux-gnueabihf/libc.so.6 /usr/lib/arm-linux-gnueabihf/libc_nonshared.a  AS_NEEDED ( /lib/arm-linux-gnueabihf/ld-linux-armhf.so.3 ) )

就在第一次测试中,我发现 tar 会将所有相对链接转换为绝对链接,但是如果我列出 tar 文件,一切都是相对正确的。

Tar 将相对符号链接更改为绝对符号链接

于 2018-03-30T22:49:14.383 回答