4

我正在尝试使用如下语句在我的规范文件中设置 rpath

export LDFLAGS="-Wl-rpath=$ORIGIN/../lib"

但我无法正确转义“$ORIGIN”。我需要 gcc 的命令来包含字符串“$ORIGIN”,而不是沿行的任何地方展开它。我试过了

\\\$ORIGIN
$$ORIGIN
\$\$ORIGIN
\\$\\$ORIGIN
\\\\\\$ORIGIN
\\\\\\\\$ORIGIN

和其他一些没有成功的人。转义字符的正确顺序是什么?

4

2 回答 2

1

好吧。我做了一些快速测试,我相信我知道你需要做什么。

尝试使用以下方法之一:

export LDFLAGS="-Wl,-rpath=\\$\$ORIGIN/../lib"

或者

export LDFLAGS="-Wl,-rpath="'\$$ORIGIN'"/../lib"
于 2014-07-11T03:27:36.633 回答
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.

但是,从规范文件中,我需要额外的时间来转义反斜杠。以下是%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 字段。

希望这对你有用。

(PS请忽略/usr/local/<package>-<version>前缀。这只是我一直在尝试的一种打包方法,以满足我组织的一些打包需求。)

于 2014-07-30T21:20:41.800 回答