g ++ libc.so绝对路径交叉编译错误

时间:2013-10-13 23:44:25

标签: c++ linux gcc cross-compiling

我使用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库中的绝对路径可能存在符号链接。这是我收到链接器错误的原因吗?

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

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并且大部分都解决了。

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

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

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

tar将在sysroot文件夹中的主机上解压缩,并且所有链接都是固定的,所有文件都被固定。

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 changes relative symlinks to absolute symlinks