25

FreeBSD マシンで、実行時に libFoundation.so を見つける必要があるバイナリ「CeeloPartyServer」があります。どちらも同じディレクトリにあります。linker flag を使用して (別のプラットフォームで、クロス コンパイラを使用して) CeeloPartyServer をコンパイルします-rpath=$ORIGIN

> 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=$ORIGINです。

私のreadelf分析は実際にライブラリrpathが$ORIGINに設定されていることを示しているので、$などをエスケープする必要はないと確信しています。私は何が欠けていますか?

4

3 に答える 3

42

gcc と binutils を使用していると仮定しています。

もしあなたがそうするなら

readelf -d CeeloPartyServer | grep ORIGIN

上記で見つけた RPATH 行が返されるはずですが、フラグに関するエントリもいくつか表示されるはずです。以下は、私が構築したライブラリからのものです。

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/../lib]
0x000000000000001e (FLAGS)              ORIGIN
0x000000006ffffffb (FLAGS_1)            Flags: ORIGIN

ある種の FLAGS エントリが表示されない場合は、オブジェクトを元の処理が必要であるとマークするようにリンカーに指示していない可能性があります。binutils ld では、-z originフラグを渡すことでこれを行います。

ただし、リンクを駆動するためにgccを使用していると思います。その場合-Wl,-z,origin、gccリンク行に追加して、コンパイラを介してフラグを渡す必要があります。

于 2011-06-13T14:25:56.637 に答える
16

このフラグがリンカーに認識される前に通過するレイヤーの数によっては、$$ORIGINまたはを使用する必要がある場合もあり\$$ORIGINます。readelf似ているか似ている RPATH ヘッダーが表示されたら、それが正しいことがわかります$ORIGIN/../lib。余分な $ とバックスラッシュは、$ がチェーン内の他のツールによって処理されるのを防ぐためのものです。

于 2011-06-15T02:34:35.447 に答える