如何使用相对rpath编译OpenSSL

Phi*_* A. 8 openssl makefile rpath

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

$ORIGIN/../lib64
Run Code Online (Sandbox Code Playgroud)

每次我readelf -d apps/openssl,我得到的结果如下,取决于我尝试的逃避变化:

\RIGIN/../lib64
RIGIN/../lib64
ORIGIN/../lib64
Run Code Online (Sandbox Code Playgroud)

我想在不使用像chrpath这样的外部工具的情况下设置我的rpath.它可能吗?我基本上会接受任何不涉及使用像chrpath这样的外部工具的东西(虽然我已经完成了).

理想情况下,我想通过在命令行(任何形式-Wl,-rpath,$ORIGIN/../lib64)上传递选项来实现.

我不介意编辑生成的Makefile,这是我最后一次尝试的.如果我能打印出一个愚蠢的美元符号!我尝试在BUILDENV =块下修改LIBRPATH而没有运气.到目前为止我的最好成绩:

LIBRPATH=$$'ORIGIN/../lib64 # result: /../lib64
LIBRPATH=$$$$'ORIGIN/../lib64 # result: 12345<pid>/../lib64 
Run Code Online (Sandbox Code Playgroud)

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

sir*_*rge 7

在你的makefile中试试:

-Wl,-rpath,${ORIGIN}/../lib64
Run Code Online (Sandbox Code Playgroud)

我假设ORIGIN是一个shell变量.

编辑

我刚刚找到了你的问题的答案(更好的迟到然后永远):你需要阻止make插入变量,为此你需要使用$$(双dolar符号):

-Wl,-rpath,'$$ORIGIN/../lib64'
Run Code Online (Sandbox Code Playgroud)

我知道它的工作原理是因为我用我自己的应用程序测试过它,享受:)


Phi*_* A. 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)"
Run Code Online (Sandbox Code Playgroud)

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

DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,'"'$$'"ORIGIN/../lib64'"
Run Code Online (Sandbox Code Playgroud)

编译后:

readelf -d apps/openssl | grep RPATH
 0x000000000000000f (RPATH)              Library rpath: ['$ORIGIN/../lib64']
Run Code Online (Sandbox Code Playgroud)