为 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-优化
- --no-tls-get-addr-optimize
有没有办法禁用 __tls_get_addr_opt
以便构建我的应用程序,或者有没有解决这个问题的方法(回到古代除外)?
我终于想通了。
诀窍是告诉 G++ 将参数传递给链接器。
这是通过将上述开关添加到逗号分隔列表来实现的,如下所示:
-Wl,-rpath-link,${DEPS_DIR}/powerpc-linux-gnu/lib,--no-tls-optimize,--no-tls-get-addr-optimize
我使用 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-优化
- --no-tls-get-addr-optimize
有没有办法禁用 __tls_get_addr_opt
以便构建我的应用程序,或者有没有解决这个问题的方法(回到古代除外)?
我终于想通了。
诀窍是告诉 G++ 将参数传递给链接器。 这是通过将上述开关添加到逗号分隔列表来实现的,如下所示:
-Wl,-rpath-link,${DEPS_DIR}/powerpc-linux-gnu/lib,--no-tls-optimize,--no-tls-get-addr-optimize