私はこれを理解することができました。テストには curl-7.19.7 を使用しました。$ORIGIN
コマンド ラインから、make をコンパイラに渡すには、次のようにすれば十分です。
export LDFLAGS='-Wl,-rpath=\$$ORIGIN/../lib'
./configure --prefix=/tmp/curl
make
make install
を使用して確認しreadelf --dynamic /tmp/curl/bin/curl
ました。
ただし、specfile から、バックスラッシュを余分にエスケープする必要がありました。%build
これは、specfileのセクションから機能したものです。
%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>
プレフィックスは無視してください。これは、組織のパッケージ化のニーズを満たすために実験してきたパッケージング方法です。)