我使用PowerPC架构为嵌入式设备开发软件。最近,我们进行了新的固件升级,制造商提供了一个无法构建可运行二进制文件的工具链。
[除了少数例外,我已经完全静态地编译了二进制文件,操作系统给了我以下错误:
isobuslog.bin: /lib/ld.so.1: version `GLIBC_2.22' not found (required by isobuslog.bin)
我整天忙于浏览大量邮件列表和主题,以寻求解决方案。我终于看了一篇帖子,其中输入了以下命令:powerpc-linux-gnu-readelf -Ws app/bin/isobuslog.bin | grep GLIBC_2.22
输出如下:
142: 00000000 0 FUNC GLOBAL DEFAULT UND __tls_get_addr_opt@GLIBC_2.22 (14)
进一步研究,似乎这是一个线程本地存储优化例程,该例程在GLIBC v2.22中可用。我提供的SDK和我自己安装的SDK都具有高于2.22的GLIBC版本,并且至少具有G ++ 6.3(由OEM提供的6.3,在我的计算机上本地安装的9.2.1)-因此,除非我使用以下方法,否则无法解决此问题提供的以前的VM(基于使用GCC 4.6的旧Debian)-这不是一个选择,因为我们需要C ++ 11和更高版本,without使用Boost。
我尝试了更多搜索,发现这两个链接器标志似乎不起作用,导致链接器退出并显示错误代码,表示无法识别所提供的标志。
有没有一种方法可以禁用__tls_get_addr_opt
,以便我的应用程序可以生成,或者有没有办法解决此问题(回溯到远古时代除外)?
我终于明白了。
技巧是告诉G ++将参数传递给链接器。这是通过将上述开关添加到逗号分隔的列表中来实现的,如下所示:
-Wl,-rpath-link,${DEPS_DIR}/powerpc-linux-gnu/lib,--no-tls-optimize,--no-tls-get-addr-optimize