2013-07-28 69 views
3

我正在修改一個與Automake/libtool文檔提供的示例非常相似的項目。摘錄:libtool安裝保留了可執行文件的臨時路徑

頂LEVE 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」以進行配置)。此外,如果libdir存在於系統的ld.so搜索路徑中,現代libtool版本實際上會刪除RPATH。

爲什麼這不會發生?就目前而言,臨時的RPATH目錄存在安全風險,允許任何人從/src/.libs加載惡意的libname.so。

Fedora RPath包裝草案包含一些退出有用的建議,以消除RPATH,但我更喜歡在Autotools框架內工作的答案。

回答

0

我覺得這裏發生了什麼是libtool是越來越貴的-static使用迷惑 - 你想要的是什麼,通常默認情況與libtool,這是觸發二進制文件的重新鏈接,使其下降到DT_RPATH定義。

但是,由於您要告訴該工具您需要一個完整的靜態構建,它預計重新鏈接是不必要的,因此不會執行它。

另一方面,我很驚訝,當您使用-static--disable-staticlibtool不會錯誤。