2013-07-28 11 views
3

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

Топ-Леве 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/Имя_библиотеки. la

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

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

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

ответ

0

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

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

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