9

我一直在尝试使用以下 rpath 编译 openssl 1.0.0g:

$ORIGIN/../lib64

每次 I readelf -d apps/openssl,根据我尝试的转义变化,我得到如下结果:

\RIGIN/../lib64
RIGIN/../lib64
ORIGIN/../lib64

我想在不使用 chrpath 等外部工具的情况下设置我的 rpath。有可能吗?我基本上会接受任何不涉及使用外部工具(如 chrpath)的东西(尽管我已经完成了)。

理想情况下,我想通过在命令行上传递选项(任何形式的-Wl,-rpath,$ORIGIN/../lib64)来做到这一点。

我不介意编辑生成的 Makefile,这是我最后尝试的。如果我能得到它打印一个愚蠢的美元符号!我尝试在 BUILDENV= 块下修改 LIBRPATH ,但没有成功。迄今为止我最好的成绩:

LIBRPATH=$$'ORIGIN/../lib64 # result: /../lib64
LIBRPATH=$$$$'ORIGIN/../lib64 # result: 12345<pid>/../lib64 

我已经阅读了各种与 rpath 相关的问题,并尝试了各种转义和引用技巧,但到目前为止没有任何效果!

4

5 回答 5

8

在你的makefile中尝试:

-Wl,-rpath,${ORIGIN}/../lib64

我假设ORIGIN是一个 shell 变量。

编辑

我刚刚找到了您问题的答案(迟到总比永远好):您需要防止 make 插入变量,为此您需要使用 $$ (双美元符号):

-Wl,-rpath,'$$ORIGIN/../lib64'

我知道它有效,因为我已经用我自己的应用程序对其进行了测试,享受 :)

于 2012-02-22T17:30:17.900 回答
2

我走了 chrpath 的方式。 http://enchildfone.wordpress.com/2010/03/23/a-description-of-rpath-origin-ld_library_path-and-portable-linux-binaries/

在 openssl 中对抗 `$$ORIGIN` 的 shell 扩展是相当复杂的。迟早,它会因为美元符号而扩大。如果你真的想走这条路,你可以做到。我发现以下内容可以在 Linux 上使用 openssl 1.0.1g。在 Makefile.shared 中,查找这一行:

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)"

将其替换为以下内容。这个引用符中和了$. double$$是在 makefile 中获取单个美元符号的方法。

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,'"'$$'"ORIGIN/../lib64'"

编译后:

readelf -d apps/openssl | grep RPATH
 0x000000000000000f (RPATH)              Library rpath: ['$ORIGIN/../lib64']
于 2014-04-15T21:53:54.090 回答
1

好吧,我花了几个小时来解决同样的问题并尝试各种疯狂的逃避方式,有一次我达到了八个$迹象,此时我决定必须有另一种方式。

事实上,至少在 GNU 中似乎存在ld

而不是-Wl,-rpath,\\$$$\$\$\$$$\$\\\\$或其他一些古老的神调用怪物,只需这样做:

echo '-rpath=$ORIGIN/../lib64' > rpathorigin
./config -Wl,@$(pwd)/rpathorigin ...

我没有看到那个ld.gold文件@标志,我不知道,比如说,lld。但是,如果您使用的是 GCC 并且它正在调用 BFD ld,那么上面的方法可能对您有用。

当然,与 origin 一起使用的实际路径应该根据需要自定义,我对./configvs没有意见./Configure。但是使用响应文件技巧似乎完全避开了外壳/逃避噩梦。

于 2021-04-25T02:32:47.280 回答
0

我不介意编辑生成的 Makefile,这是我最后尝试的.​​..

我不确定您是否可以使用 shell 变量和相对路径来设置它。我认为不会ldd扩展$ORIGINin $ORIGIN/../lib64。在这种情况下,我认为您需要使用添加ldconfig到库的搜索路径。有关更多详细信息,请参阅在服务器故障上查找 ldd 搜索路径。 $ORIGIN/../lib64

由于我不确定,我还是会提供说明。您不需要更改 Makefile。事实上,过去我没有任何运气这样做,因为事情会被覆盖,而其他事情则会CFLAGSLDFLAGS忽略。

另请参阅使用 RPATH 构建 OpenSSL?您的问题和引用的问题是不同的问题,它们收敛于相似的答案(它们之间没有重复)。但它提供了 OpenSSL 开发人员在 RPATH 上的位置。这是一封私人电子邮件,所以我分享了相关的细节而不是整个信息。

如果您设法嵌入$ORIGIN/../lib64ELF 部分并且它有效,那么请报告。下面,我正在使用/usr/local/ssl/lib我的 RPATH。你应该替换$ORIGIN/../lib64/usr/local/ssl/lib.


OpenSSL 支持RPATH开箱即用的 BSD 目标(但不支持其他目标)。从配置:

# Unlike other OSes (like Solaris, Linux, Tru64, IRIX) BSD run-time
# linkers (tested OpenBSD, NetBSD and FreeBSD) "demand" RPATH set on
# .so objects. Apparently application RPATH is not global and does
# not apply to .so linked with other .so. Problem manifests itself
# when libssl.so fails to load libcrypto.so. One can argue that we
# should engrave this into Makefile.shared rules or into BSD-* config
# lines above. Meanwhile let's try to be cautious and pass -rpath to
# linker only when --prefix is not /usr.
if ($target =~ /^BSD\-/)
    {
    $shared_ldflag.=" -Wl,-rpath,\$(LIBRPATH)" if ($prefix !~ m|^/usr[/]*$|);
    }

对 OpenSSL 1.0.2 执行此操作的最简单方法似乎是 在配置期间将其添加到链接器标志中

./config -Wl,-rpath=/usr/local/ssl/lib

您还可以编辑配置行并对rpath. 例如,我正在研究 Debian x86_64。Configure所以我在编辑器中打开文件,复制linux-x86_64,命名它linux-x86_64-rpath,并进行以下更改以添加-rpath选项:

"linux-x86_64-rpath",   "gcc:-m64 -DL_ENDIAN -O3 -Wall -Wl,-rpath=/usr/local/ssl/lib::
-D_REENTRANT::-Wl,-rpath=/usr/local/ssl/lib -ldl:SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:
${x86_64_asm}:elf:dlfcn:linux-shared:-fPIC:-m64:.so.\$(SHLIB_MAJOR).\$(SHLIB_MINOR):::64",

上面,字段 2 和 6 已更改。它们对应于$cflag$ldflag在 OpenSSL 的构建系统中。

然后,使用新配置进行配置:

$ ./Configure linux-x86_64-rpath shared no-ssl2 no-ssl3 no-comp \
    --openssldir=/usr/local/ssl enable-ec_nistp_64_gcc_128

最后,在 之后make,验证设置卡住:

$ readelf -d ./libssl.so | grep -i rpath
 0x000000000000000f (RPATH)              Library rpath: [/usr/local/ssl/lib]
$ readelf -d ./libcrypto.so | grep -i rpath
 0x000000000000000f (RPATH)              Library rpath: [/usr/local/ssl/lib]
$ readelf -d ./apps/openssl | grep -i rpath 
 0x000000000000000f (RPATH)              Library rpath: [/usr/local/ssl/lib]

一旦你执行make install, thenldd将产生预期的结果:

$ ldd /usr/local/ssl/lib/libssl.so
    linux-vdso.so.1 =>  (0x00007ffceff6c000)
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007ff5eff96000)
    ...

$ ldd /usr/local/ssl/bin/openssl 
    linux-vdso.so.1 =>  (0x00007ffc30d3a000)
    libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00007f9e8372e000)
    libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00007f9e832c0000)
    ...
于 2015-05-07T16:47:19.790 回答
0

不要问我为什么,但这在OpenSSL 1.1.1i中对我有用,可以解决 $ 符号问题:

\$\$\$$ORIGIN

例子:

./Configure linux-x86_64 '-Wl,-rpath,\$\$\$$ORIGIN'

或者,如果此命令行 hack 与您不一致,您始终可以chrpath按照其他人的建议在构建后使用:

./Configure linux-x86_64 '-Wl,-rpath,XORIGIN'
make depend
make all
chrpath -r "\$ORIGIN" libssl.so
于 2021-02-18T00:57:24.640 回答