質問

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で直接提供している場合

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top