libtool 安装保留可执行文件的临时 rpath

use*_*087 5 linux automake rpath libtool

我正在修改一个与Automake / libtool文档提供的示例非常相似的项目。摘录:

顶级configure.ac:

LT_INIT
Run Code Online (Sandbox Code Playgroud)

顶级 Makefile.am:

ACLOCAL_AMFLAGS = -I m4
SUBDIRS = src doc
Run Code Online (Sandbox Code Playgroud)

./src 生成文件.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
Run Code Online (Sandbox Code Playgroud)

在我的包创建软件提供的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
Run Code Online (Sandbox Code Playgroud)

在所有三个 *.la 文件中,libdir='/usr/lib'

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

我知道为 /src/progname 设置了 RPATH 以允许在 make 之后直接执行。但是我的印象是,在安装规则期间,libtool 会删除这个临时 RPATH 并将其替换为 libdir(上面指定的“/usr/lib”进行配置)。此外,如果系统的 ld.so 搜索路径中存在 libdir,现代 libtool 版本实际上会删除 RPATH。

为什么这没有发生?就目前而言,临时 RPATH 目录存在安全风险,允许任何人从 /src/.libs 加载恶意 libname.so。

Fedora RPath Packaging Draft 包含一些移除 RPATH 的有用建议,但是我更喜欢在 Autotools 框架内工作的答案。

Die*_*enò 1

我认为这里发生的事情是libtool你对 \xe2\x80\x94 的使用感到困惑-static,你想要的是默认情况下通常会发生的事情libtool,那就是触发二进制文件的重新链接,以便它删除定义DT_RPATH

\n\n

但是,由于您告诉工具您想要完整的静态构建,因此它认为重新链接是不必要的,因此不会执行它。

\n\n

另一方面,我很惊讶当您使用andlibtool时不会出错。-static--disable-static

\n