• 締切済み

名前が lib で始まらない so のリンク

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 に置かないと動かなくなってしまいます。 以上です。、どなたかご回答をよろしくお願いいたします。

みんなの回答

回答No.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.

tknakamuri
質問者

お礼

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 にはなりません。

tknakamuri
質問者

補足

ありがとうございます。早速やってみて、確かにリンクはできるのですが、 埋め込まれた 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/ の部分を埋め込まないようにする方法はないでしょうか?

関連するQ&A