4

次のようなステートメントを使用して、スペックファイルにrpathを設定しようとしています

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

しかし、「$ORIGIN」を正しくエスケープできません。行に沿ってどこにも展開しないで、文字列「$ORIGIN」を含めるにはgccへのコマンドが必要です。私は試した

\\\$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 を使用しました。$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>プレフィックスは無視してください。これは、組織のパッケージ化のニーズを満たすために実験してきたパッケージング方法です。)

于 2014-07-30T21:20:41.800 に答える