rpath = $ ostionは望ましい効果がありませんか?
質問
FreeBSDマシンで、実行時にLibFoundation.oを見つける必要があるバイナリ「CeelopartyServer」を持っています。どちらも同じディレクトリにあります。 (クロスコンパイラを使用して、別のプラットフォームで)ceeelopartyServer "-rpath = $ ogin"を使用してコンパイルします。
> readelf -d CeeloPartyServer |grep -i rpath 0x0000000f (RPATH) Library rpath: [$ORIGIN] > ls CeeloPartyServer Contents Foundation.framework libFoundation.so > ./CeeloPartyServer /libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer"
ライブラリを実行しようとしたときに、なぜそれが図書館を見つけないのですか?私の正確なリンカーラインは次のとおりです。-lm -lmysql -rpath = $ ostion。私のReadelf Analysisは実際にライブラリRPATが$ Originに設定されていることを実際に示しているため、私は $などを逃れる必要はないと確信しています。何が足りないの?
解決
GCCとBinutilsを使用していると思います。
もしあなたがそうするなら
readelf -d CeeloPartyServer | grep ORIGIN
上記のRPATHラインを取り戻す必要がありますが、フラグに関するいくつかのエントリも表示されます。以下は、私が構築した図書館からのものです。
0x000000000000000f (RPATH) Library rpath: [$ORIGIN/../lib]
0x000000000000001e (FLAGS) ORIGIN
0x000000006ffffffb (FLAGS_1) Flags: ORIGIN
フラグのエントリのようなものが表示されていない場合は、おそらくリンカーにオブジェクトの処理が必要であるとマークするように指示していないでしょう。 Binutils Ldを使用すると、 -z origin
国旗。
ただし、GCCを使用してリンクを駆動していると推測しているので、その場合、コンパイラにフラグを渡す必要があります。 -Wl,-z,origin
GCCリンクラインに。
他のヒント
リンカーが表示される前にこのフラグが通過するレイヤーの数に応じて、使用する必要がある場合があります $$ORIGIN
あるいは \$$ORIGIN
. 。あなたはあなたがいつそれを持っていることを知っているでしょう readelf
見た目のrpathヘッダーを表示します $ORIGIN/../lib
または類似。余分な$とバックスラッシュは、チェーン内の他のツールによって$が処理されるのを防ぐためだけです。
$ origin chrpathおよび $ $ oginを使用している場合は、ldflagsで直接提供している場合