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

时间:2018-08-03 21:11:08

标签: linker aix autotools autoconf powerpc

我们在使用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。这是我们在运行香草./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:

1 个答案:

答案 0 :(得分:2)

  

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

自动工具没有覆盖您的LDFLAGS。这样做不属于他们的能力,an explicit design philosophy of the Autotools不能凌驾于项目建设者的决定。

但是,LDFLAGS不是链接选项的唯一来源。还添加了编译器标志,尤其是,要链接的库根本不应该包含在LDFLAGS(或AM_LDFLAGSmytarget_LDFLAGS)中,因为这些变量(第一个和第二个恰好是后两个之一)在链接的对象列表之前展开。

但是最重要的是,libtool添加了它认为适当的标志,这就是-Wl,-blibpath来自您的情况的来源。

  

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

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

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