libtool install сохраняет временный rpath исполняемого файла

Я модифицирую проект, который очень похож на примеры из Automake / документация libtool. Отрывки:

Верхний уровень configure.ac:

LT_INIT

Makefile.am верхнего уровня:

ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src doc

./src Makefile.am:

lib_LTLIBRARIES = libname.la
libname_la_SOURCES = <my cc file list>
libname_la_LDFLAGS = -no-undefined -version-info $(GENERIC_LIBRARY_VERSION)
include_HEADERS = <my h file list>

bin_PROGRAMS = progname
progname_SOURCES = <my cc file list>
progname_LDADD = libname.la
progname_LDFLAGS = -static

В среде fakeroot, предоставляемой моим программным обеспечением для создания пакетов, я выполняю следующие команды

$ autogen.sh # contains the usual calls to aclocal, libtoolize, automake, autoconf.
$ ./configure --prefix="/usr" --disable-static
$ make
 ...
 /bin/sh ../libtool  --tag=CXX   --mode=link g++ -Wall -g -O2 -static  -o progname progname.o libname.la  <-lLIBRARY_NAME list>
 libtool: link: g++ -Wall -g -O2 -o progname progname.o  ./.libs/libname.so <-lLIBRARY_NAME list> -Wl,-rpath -Wl,<build_dir>/src/.libs
 ...
$ objdump -x src/progname | grep -i rpath
 RPATH                <build_dir>/src/.libs
$ make install
$ objdump -x <fakeroot_dir>/usr/bin/progname | grep -i rpath
 RPATH                <build_dir>/src/.libs

Во всех трех файлах * .la libdir='/usr/lib':

  • /src/libname.la
  • /src/.libs/libname.la
  • /usr/lib/libname.la

Я понимаю, что RPATH настроен для / src / progname, чтобы разрешить выполнение сразу после make. Однако у меня создалось впечатление, что во время установки правила libtool удалит этот временный RPATH и заменит его на libdir ("/ usr / lib", как указано выше для настройки). Более того, современные выпуски libtool фактически удаляли бы RPATH, если бы libdir присутствовала в системном пути поиска ld.so.

Почему этого не происходит? В его нынешнем виде временный каталог RPATH представляет собой угрозу безопасности, позволяя любому загрузить вредоносное имя библиотеки libname.so из /src/.libs.

Черновик пакета Fedora RPath содержит несколько полезных предложений по удалению RPATH, однако я бы предпочел ответы, которые работают в рамках Autotools.


person user19087    schedule 28.07.2013    source источник


Ответы (2)


Я думаю, что здесь происходит то, что libtool сбивается с толку из-за того, что вы используете -static - то, что вы хотите, обычно происходит по умолчанию с libtool, а именно запускает повторное связывание двоичных файлов, чтобы оно отбрасывало определение DT_RPATH.

Но поскольку вы сообщаете инструменту, что хотите получить полную статическую сборку, он ожидает, что повторное связывание будет ненужным, и поэтому не выполняет его.

С другой стороны, я удивлен, что libtool не выдает ошибку при использовании -static и --disable-static.

person Diego Elio Pettenò    schedule 12.06.2014

Сообщите configure.ac patch сгенерированный $(top_srcdir)/libtool, чтобы -Wl,-rpath -Wl,/... вылетели

TL; DR - Добавьте следующее (β) к configure.ac:

AC_MSG_RESULT([configure: removing rpath from libtool...])
sed -i.old s/'^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec="-D__LIBTOOL_IS_A_FOOL__"'/g libtool
diff -u0 libtool.old libtool
  • Если вы используете LT_OUTPUT (пожалуйста, прекратите делать что), β должно быть после LT_OUTPUT
  • В противном случае β должно быть после AC_OUTPUT
person Darren Ng    schedule 15.04.2021