プロが教えるわが家の防犯対策術!

linux(CENTOS 6.4)で、命名規約が lib で始まらない so のリンクで困ってます。

ld -share -L /XXXXXX -lfoo -o bar.so (各種オブジェクト)
(foo.so というso が/XXXXXX にある。)

とすると、必ず cannot find -lfoo になります。

foo100.so は元々 dlopen でロードするために作られたライブラリ(C++)で
名称がlibから始まらないのですが、foo.so内部の C++ のクラスを
継承したクラスを含む bar.so を作るため、リンクが必要になりました。

foo.so を libfoo.so に名称変更すればリンクできるのですが、命名は
規約で決まっています。そのままの名称を指定する手段は
ないのでしょうか?

ld -share -o bar.so /XXXXXX/foo.so (各種オブジェクト)

とすればリンクは通りますが、bar.so の中に /XXXXXX/foo.so というパスが
埋め込まれるため、foo.so を /XXXXXX に置かないと動かなくなってしまいます。

以上です。、どなたかご回答をよろしくお願いいたします。

A 回答 (1件)

ld(1)のマニュアルを見る限り-l:foo.soでいけそうですが、gccがldにそのコマンドを渡してくれない場合は-Wl,-l:foo.soでやるしかないでしょうね。



参考までに
http://linux.die.net/man/1/ld
| -l namespec
| --library=namespec
(snip)
| If namespec is of the form :filename, ld will search the library path
| for a file called filename, otherwise it will search the library path for
| a file called libnamespec.a.

http://linux.die.net/man/1/gcc
|-Wl,option
| Pass option as an option to the linker.

この回答への補足

ありがとうございます。早速やってみて、確かにリンクはできるのですが、
埋め込まれた so の情報に ディレクトリ情報もくっついてしまいます。
つまり、 -l を用いずに、引数として so のパスを指定したのと同じ結果になりました。

ld -shared -o bar.so -L../foo -l:foo.so ・・・・・・・

[readelf で bar.so の Dynamic section のダンプ]

Dynamic section at offset 0x678 contains 14 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [../foo/foo.so]


これですと、実行ファイルと foo.so の位置関係が固定されてしまうようです。

../foo/ の部分を埋め込まないようにする方法はないでしょうか?

補足日時:2013/05/29 09:59
    • good
    • 0
この回答へのお礼

Linuxカテで解決しました。

こちらにも解決策を載せておきます。

■予め foo.so に soname を付ける

ld -shared -o foo.so -soname foo.so ・・・・・・・

■リンクする
ld -shared -o bar.so -L../foo -l:foo.so ・・・・・・・

これだけでした。こうすると、bar.so がロードするライブラリ名称は
foo.so になります。../foo/foo.so にはなりません。

お礼日時:2013/05/29 15:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!