我正在尝试使用类似
的语句在我的spec文件中设置rpathexport LDFLAGS="-Wl-rpath=$ORIGIN/../lib"
但我无法正确逃避" $ ORIGIN"。我需要gcc的命令来包含字符串" $ ORIGIN",而不是在它的任何地方展开它。我试过了
\\\$ORIGIN
$$ORIGIN
\$\$ORIGIN
\\$\\$ORIGIN
\\\\\\$ORIGIN
\\\\\\\\$ORIGIN
和其他几个没有成功。什么是正确的转义字符序列?
答案 0 :(得分:1)
好的。我做了一些快速测试,我相信我想出了你需要做什么。
尝试使用以下其中一项:
export LDFLAGS="-Wl,-rpath=\\$\$ORIGIN/../lib"
或
export LDFLAGS="-Wl,-rpath="'\$$ORIGIN'"/../lib"
答案 1 :(得分:0)
我设法弄明白了。我使用curl-7.19.7进行测试。从命令行,以下内容足以让make将$ORIGIN
传递给编译器:
export LDFLAGS='-Wl,-rpath=\$$ORIGIN/../lib'
./configure --prefix=/tmp/curl
make
make install
我使用readelf --dynamic /tmp/curl/bin/curl
进行了验证。
然而,从specfile中,我需要额外的时间来逃避反斜杠。以下是specfile的%build
部分的用法:
%define ldflags LDFLAGS='-Wl,-rpath=\\$$ORIGIN/../lib'
%configure --enable-shared %{ldflags}
make %{?_smp_mflags}
要验证,这是readelf
的输出:
[faceplant ~/rpmbuild/specs]% readelf --dynamic ../buildroot/sis-curl-7.19.7-2.el6.x86_64/usr/local/curl-7.19.7/bin/curl
Dynamic section at offset 0x1c028 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libcurl.so.4]
0x0000000000000001 (NEEDED) Shared library: [libssl.so.1.0.0]
0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.1.0.0]
0x0000000000000001 (NEEDED) Shared library: [librt.so.1]
0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [$ORIGIN/../lib:/usr/local/curl-7.19.7/lib]
0x000000000000000c (INIT) 0x401b98
0x000000000000000d (FINI) 0x40b2f8
0x000000006ffffef5 (GNU_HASH) 0x400260
0x0000000000000005 (STRTAB) 0x400cb0
0x0000000000000006 (SYMTAB) 0x4002c0
0x000000000000000a (STRSZ) 1229 (bytes)
0x000000000000000b (SYMENT) 24 (bytes)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x61c220
0x0000000000000002 (PLTRELSZ) 2160 (bytes)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x401328
0x0000000000000007 (RELA) 0x4012c8
0x0000000000000008 (RELASZ) 96 (bytes)
0x0000000000000009 (RELAENT) 24 (bytes)
0x000000006ffffffe (VERNEED) 0x401258
0x000000006fffffff (VERNEEDNUM) 2
0x000000006ffffff0 (VERSYM) 0x40117e
0x0000000000000000 (NULL) 0x0
如您所见,$ORIGIN/../lib
毫发无损地将其置于RPATH字段中。
希望这适合你。
(P.S。请忽略/usr/local/<package>-<version>
前缀。这只是我一直在试验的包装方法,以满足我的组织的一些包装需求。)