我正在修改一个与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框架内工作的答案。