適当に翻訳する。
例:libpng 機能を要する emacs の構築にあたって、静的 PNG ライブラリを結合する場合、「-lz」を使う。ところが、動的結合だとこれでは拙い。zlib の版の上位番号が更新された時、emacs が zlib を全く使っていなくても libpng がそれを使用しているというだけで、emacs を再構築しなければならない。
「ldd -u -r」を使う。以下が例。
% ldd -u -r /usr/bin/emacs
Unused direct dependencies:
/usr/lib/libXext.so.6
/lib/libz.so.1
ここで説明されている警告を見ることになる。(調査は spec-helper の strip_and_check_elf_files によって行われる。)
必要な結合印(linker flags)を得るために $(pkg-config --libs somefoo) を使用しているソフトウェアがある。pkg-config は「*.pc」文書の「Libs:」欄と「Requires:」欄を通じて結合印(linker flags)を得る。
しかしながら、多くの「*.pc」文書ではそれ自身の依存関係が誤って「Libs:」や「Requires:」に記述されている。当のパッケージだけが利用し、そのパッケージを用いる他のパッケージには知らせない類いの依存性は、「Libs.private:」と「Requires.private:」に記述されるべきであるにもかかわらず。(これには歴史的な理由がある。Requires.private と Libs.private は 0.18 版以前の pkg-config には存在せず、両者とも後方互換でないのだ。)
gtk+-2.0.pc からの例:
Requires: gdk-${target}-2.0 atk cairo
これは次のように記述するべき:
Requires.private: gdk-${target}-2.0 atk cairo
ffmpeg の libavcodec.pc からの例:
Libs: -L${libdir} -lavcodec -lz -pthread -lm -la52 -lfaac -lfaad -lmp3lame -lm -lnut -ltheora -logg -lvorbisenc -lvorbis -logg -lx264 -lm -lxvidcore -ldl -ldl -lX11 -lXext
これも次のように記述されるべき:
Libs.private: -lz -pthread -lm -la52 -lfaac -lfaad -lmp3lame -lm -lnut -ltheora -logg -lvorbisenc -lvorbis -logg -lx264 -lm -lxvidcore -ldl -ldl -lX11 -lXext
Libs: -L${libdir} -lavcodec
libtool アーカイヴ(*.la)の中には使用されているライブラリの一覧表があり、ライブラリは再起的に記録されている。標準の libtool はこれらのライブラリを、動的に結合されるものも含めて、明示的に記述する。この点は debian からのパッチ(patch)で修正されている。
しかしながら、ソフトウェアには大抵それ自身の libtool が同梱されている。configure の前に「autoreconf」を走らせ、これを更新する方法もある。しかしこのやり方は失敗することもよくあるので、Mandriva は %configure と %configure2_5x で呼び出される「fix-libtool-overlinking」という指示文(script)を用意している。
libtool archives も見よ。
残念なことに、libtool と *.pc 文書を修正するだけでは十分ではない。
コードを直し、上流の開発者に報告するのが、上記の問題の最良の修正方法だ。
正確に修正して上流の開発者に報告するのは骨が折れるし時間もかかる。--as-needed を使うのが簡単な直し方だ。Mandriva では2008年5月から広域の(global) --as-needed が使われている。
--as-needed によって問題が生じた場合、下潜結合(underlinked)のライブラリが原因かもしれない。
[me@mandrivapc]$ %define _disable_ld_as_needed 1 を使って問題を回避してはいけない。これはその場しのぎにしかならない。ライブラリ自体を修正するべき。(参考:fedora は prelink を導入した2003年には、もうこれらの問題を修正するパッチ(patches)を出していた。)
gcc -Wl,--as-needed -lfoo bar.o
これは良くない。「ld」は後ろに続く文書群の中から未解決のシンボルを探すから。そのため [me@mandrivapc]$ -lfoo は --as-needed を使用した場合、単に無視される。
ライブラリが *.o 文書の後に置かれるようにする。
gcc -Wl,--as-needed bar.o -lfoo
順序の誤りは通常、ライブラリを LDFLAGS に食わせた時に起きる。(このやり方は正しくない)
詳しい説明は Gentoo の --as-needed に関する素晴らしいページを見てほしい。
pcre と --as-needed の使用によって起こる領域違反(segfault) を見てほしい。
カレンダー
カテゴリー
最新コメント
最新記事
ブログ内検索
広告