为 PPC 禁用 __tls_get_addr_opt

Disabling __tls_get_addr_opt for PPC

我使用 PowerPC 架构为嵌入式设备开发软件。最近我们得到了一个新的固件升级,制造商提供了一个无法构建可运行二进制文件的工具链。

除了少数例外,我完全静态编译了二进制文件,OS 给出了以下错误:

isobuslog.bin: /lib/ld.so.1: version `GLIBC_2.22' not found (required by isobuslog.bin)

我一整天都在大量的邮件列表和主题中来回走动,寻找解决方案。 我终于读到了 post,其中输入了以下命令: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 和至少 G++ 6.3 的 GLIBC 版本(6.3 由 OEM 提供,9.2.1 在我的机器上本地安装) - 所以没有办法解决这个问题,除非我使用提供的先前 VM,它基于使用 GCC 4.6 的旧 Debian - 这不是一个选项,因为我们需要 C++11 和更高版本,没有 使用 Boost。

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

有没有办法禁用 __tls_get_addr_opt 以便构建我的应用程序,或者有没有解决这个问题的方法(回到古代除外)?

我终于想通了。

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

-Wl,-rpath-link,${DEPS_DIR}/powerpc-linux-gnu/lib,--no-tls-optimize,--no-tls-get-addr-optimize