我们在使用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_CXXFLAGS
和AM_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:
答案 0 :(得分:2)
我的第一个问题是,它们如何覆盖我们的LDFLAGS? GNU makefile不能那样工作。 GNU始终允许用户覆盖 makefile的标志。
自动工具没有覆盖您的LDFLAGS
。这样做不属于他们的能力,an explicit design philosophy of the Autotools不能凌驾于项目建设者的决定。
但是,LDFLAGS
不是链接选项的唯一来源。还添加了编译器标志,尤其是,要链接的库根本不应该包含在LDFLAGS
(或AM_LDFLAGS
或mytarget_LDFLAGS
)中,因为这些变量(第一个和第二个恰好是后两个之一)在链接的对象列表之前展开。
但是最重要的是,libtool
添加了它认为适当的标志,这就是-Wl,-blibpath
来自您的情况的来源。
我的第二个问题是,我们如何阻止Autotools添加 链接阶段出现不需要的标志?
恐怕不容易。最好的选择可能是修改libtool
shell脚本的项目内副本以取消隐藏。这类似于Fedora的打包准则,用于禁止在ELF二进制文件中生成rpath
条目。
您可能还需要考虑更深入地了解该选项为什么给您带来麻烦。它设置了一个运行时共享库搜索路径(同样类似于rpath),如果您在使用和不使用此方法时都表现出不同的行为,则意味着在这两种情况下,不同的库正在动态链接。看来libtool
是根据编译时库搜索路径选择它要执行的路径,如果是这样,那么您应该担心所链接的库不能在运行时成功支持该程序。