在 AIX 上链接 Autotools 项目时避免使用 -blibpath

Posted

技术标签:

【中文标题】在 AIX 上链接 Autotools 项目时避免使用 -blibpath【英文标题】:Avoid -blibpath when linking an Autotools project on AIX 【发布时间】:2019-01-11 18:56:24 【问题描述】:

我们在 AIX 上使用 Autotools 构建的项目中发现了段错误。根据 gdb,它在启动代码中即将死去。使用 GNUmakefile 构建的同一个项目很好。一个相关的问题是here。

Autotools 添加了一些不寻常的链接器标志,我们相当肯定这是问题的根本原因。 Autotools生成的Makefile在线here.

还有:

libtool: link: g++ -pthread -fdata-sections -ffunction-sections -pipe -g -O2 -pt
hread -o .libs/cryptestcwd cryptestcwd-test.o ...
yptestcwd-dlltest.o cryptestcwd-fipsalgt.o cryptestcwd-adhoc.o  -L./.libs -lcryp
topp -L/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/7.2.0 -lstdc++ -lm -pthread
-Wl,-blibpath:/usr/local/lib:/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/7.2.0:
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/7.2.0:/opt/freeware/lib/gcc/powerpc
-ibm-aix7.2.0.0/7.2.0/../../..:/usr/lib:/lib

标志并非来自环境或我们的configure.ac

-bash-4.4$ echo $LDFLAGS
-bash-4.4$ echo $LDLIBS $LIBS
-bash-4.4$

还有我们添加的AM_CXXFLAGSAM_LDFLAGS

AM_CXXFLAGS:  -pthread -fdata-sections -ffunction-sections
AM_LDFLAGS:  -pthread -Wl,--demangle

我尝试make LDFLAGS="" 并覆盖 Autotools 标志,但添加了相同的标志。

我的第一个问题是,他们如何覆盖我们的LDFLAGS? GNU makefile 不是这样工作的。 GNU 总是允许用户覆盖 makefile 的标志。

我的第二个问题是,我们如何阻止 Autotools 在链接阶段添加不需要的标志?


这是我们的configure.ac。以下是我们在运行 vanilla ./configure 后添加的选项摘要:

Auto-configuration complete. A summary of options are below. If
something looks wrong then please modify config.h and please report
it at http://github.com/noloader/cryptopp-autotools.

   Build triplet: powerpc-ibm-aix7.2.0.0
 Compiler target: powerpc-ibm-aix7.2.0.0
Compiler version: g++ (GCC) 7.2.0

Static library: yes
Shared library: yes

CRYPTOPP_PPC_FLAG: -mcpu=power8 -maltivec
CRYPTOPP_CHAM_FLAG: -mcpu=power7 -maltivec
CRYPTOPP_CRC_FLAG: -mcpu=power8 -maltivec
CRYPTOPP_LEA_FLAG: -mcpu=power7 -maltivec
CRYPTOPP_GCM_FLAG: -mcpu=power8 -maltivec
CRYPTOPP_AES_FLAG: -mcpu=power8 -maltivec
CRYPTOPP_SHA_FLAG: -mcpu=power8 -maltivec
CRYPTOPP_SIMECK_FLAG: -mcpu=power7 -maltivec
CRYPTOPP_SIMON_FLAG: -mcpu=power7 -maltivec
CRYPTOPP_SPECK_FLAG: -mcpu=power7 -maltivec
CRYPTOPP_SM4_FLAG: -mcpu=power7 -maltivec

Automake flags (can be overridden by user flags):
AM_CXXFLAGS:  -pthread -fdata-sections -ffunction-sections
AM_LDFLAGS:  -pthread -Wl,--demangle

User flags (overrides Automake flags on conflict):
CXXFLAGS: -g -O2
LDFLAGS:

【问题讨论】:

您好,您使用的自动工具命令是什么? @Lorinczy - 我使用 Autotools 命令和我们通过 AM_CXXFLAGSAM_LDFLAGS 添加的标志添加了其他信息。 @Lorinczy - 你有什么想法吗?我很困惑这些额外的标志是从哪里来的,为什么我不能覆盖它们。 你应该找出这个 LDFLAGS 来自哪里,因为它是完全错误的。整个程序可以从某个地方下载吗? @Lorinczy - 是的,Autotools 前端作为一个单独的项目在Crypto++ | Autotools 提供。 【参考方案1】:

我的第一个问题是,它们如何覆盖我们的 LDFLAGS? GNU makefile 不是这样工作的。 GNU 总是允许用户覆盖 makefile 的标志。

Autotools 不会覆盖您的 LDFLAGS。这样做不在他们的权力范围内,an explicit design philosophy of the Autotools 他们不会推翻构建项目的人的决定。

但是,LDFLAGS 并不是链接选项的唯一来源。编译器标志也被添加了,特别是链接库不应该包含在LDFLAGS(或AM_LDFLAGSmytarget_LDFLAGS)中,因为这些变量(第一个也是后两个中的一个) ) 在要链接的对象列表之前展开。

但除此之外,libtool 添加了它认为合适的标志,这就是 -Wl,-blibpath 在您的情况下的来源。

我的第二个问题是,我们如何阻止 Autotools 添加 链接阶段不需要的标志?

恐怕不容易。您最好的选择可能是修改libtool shell 脚本的项目内副本以抑制它。这类似于 Fedora 的打包指南,用于禁止在 ELF 二进制文件中生成 rpath 条目。

您可能还需要考虑深入了解该选项为何会给您带来麻烦。它设置了一个运行时共享库​​搜索路径(再次类似于 rpath),如果您在有和没有的情况下获得不同的行为,则意味着在这两种情况下不同的库正在动态链接。看起来libtool 根据编译时库搜索路径选择了它执行的路径,如果是这样,那么您应该担心您链接的库在运行时无法成功支持该程序。

【讨论】:

谢谢约翰。深入挖掘以确定问题所在是行不通的。未安装符号,调试器仅在部分时间工作。事实上,我什至无法在调试器下重新启动程序。另外,我无法修复启动代码中的错误。那是别人的代码。

以上是关于在 AIX 上链接 Autotools 项目时避免使用 -blibpath的主要内容,如果未能解决你的问题,请参考以下文章

在 ubuntu 服务器 14.04 上链接的 libevent 问题

使用 CMake 在 Mac 上链接静态 GLFW 和 OpenGL

如何在 macOS 上链接 libc++?

在 textview 上链接,文本中的域不起作用,链接不可点击

在IDEA上链接数据库

在某些列表上链接函数调用