禁用__tls_get_addr_opt用于PPC

问题描述 投票:0回答:1

我使用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。

我尝试了更多搜索,发现这两个链接器标志似乎不起作用,导致链接器退出并显示错误代码,表示无法识别所提供的标志。

  • -no-tls-optimize
  • -no-tls-get-addr-optimize

有没有一种方法可以禁用__tls_get_addr_opt,以便我的应用程序可以生成,或者有没有办法解决此问题(回溯到远古时代除外)?

c++ gcc g++ ld powerpc
1个回答
0
投票

我终于明白了。

技巧是告诉G ++将参数传递给链接器。这是通过将上述开关添加到逗号分隔的列表中来实现的,如下所示:

-Wl,-rpath-link,${DEPS_DIR}/powerpc-linux-gnu/lib,--no-tls-optimize,--no-tls-get-addr-optimize
© www.soinside.com 2019 - 2024. All rights reserved.