Избегайте -blibpath при связывании проекта Autotools в AIX

Мы обнаруживаем segfault в проекте, построенном с использованием Autotools в AIX. Согласно GDB он умирает в коде запуска. Тот же проект, построенный с использованием GNUmakefile, - это хорошо. Связанная проблема здесь.

Autotools добавляет несколько необычных флагов компоновщика, и мы уверены, что это является основной причиной проблемы. Созданный Autotools Makefile находится здесь.

А также:

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? Make-файлы GNU не работают таким образом. GNU всегда позволяет пользователю переопределять флаги make-файла.

Мой второй вопрос: как мы можем запретить 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 ответ

Мой первый вопрос: как они перекрывают наши LDFLAGS? Make-файлы GNU не работают таким образом. GNU всегда позволяет пользователю переопределять флаги make-файла.

Автоинструменты не переопределяют ваши LDFLAGS, Это не в их силах, и в Autotools четко сформулирована философия проектирования, заключающаяся в том, что они не игнорируют решения человека, создавшего проект.

Тем не мение, LDFLAGS это не единственный источник ссылок. Также добавлены флаги компилятора, и, в частности, библиотеки для ссылки не должны быть включены в LDFLAGS (или же AM_LDFLAGS или же mytarget_LDFLAGS) вообще, потому что эти переменные (первая и точно одна из последних двух) раскрываются перед списком объектов для связи.

Но помимо всего этого, libtool добавляет флаги, которые он считает целесообразными, и вот где -Wl,-blibpath исходит от в вашем случае.

Мой второй вопрос: как мы можем запретить Autotools добавлять ненужные флаги во время фазы соединения?

Боюсь, не легко. Ваш лучший вариант, вероятно, заключается в изменении внутрипроектной копии libtool сценарий оболочки, чтобы подавить его. Это аналогично указаниям Fedora по упаковке для подавления генерации rpath записи в двоичных файлах ELF.

Вы также можете подумать о том, чтобы глубже понять, почему этот вариант вызывает у вас проблемы. Он задает путь поиска разделяемой библиотеки во время выполнения (опять-таки, как rpath), и если вы получаете различное поведение с и без, это подразумевает, что разные библиотеки динамически связываются в этих двух случаях. Это выглядит как libtool выбирает путь, который он делает, основываясь на пути поиска библиотеки времени компиляции, и если это так, то вас должно беспокоить, что библиотеки, с которыми вы ссылаетесь, не поддерживают программу во время выполнения.

Другие вопросы по тегам