忍者ブログ

素人翻訳

適当に翻訳する。

過剰結合(overlinking)

出典:Overlinking
許諾:Creative Common - Attibution - ShareAlike 3.0.

過剰結合(Overlinking)
目次
過剰結合とは何か

例: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 によって行われる。)

修正方法
pkg-config の問題

必要な結合印(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 の問題

libtool アーカイヴ(*.la)の中には使用されているライブラリの一覧表があり、ライブラリは再起的に記録されている。標準の libtool はこれらのライブラリを、動的に結合されるものも含めて、明示的に記述する。この点は debian からのパッチ(patch)で修正されている。

しかしながら、ソフトウェアには大抵それ自身の libtool が同梱されている。configure の前に「autoreconf」を走らせ、これを更新する方法もある。しかしこのやり方は失敗することもよくあるので、Mandriva は %configure と %configure2_5x で呼び出される「fix-libtool-overlinking」という指示文(script)を用意している。

libtool archives も見よ。

色々な問題

残念なことに、libtool と *.pc 文書を修正するだけでは十分ではない。

  • xdm は -lXinerama を附けて構築されているが、本当は要らない。/usr/lib/X11/xdm/authdir だけが -lXinerama を必要としている。しかし Makefile を簡単にするために、同じ LDFLAGS が使われている。
  • emacs は静的構築・動的構築の両方で -lz を附けて構築されているが、これは誤り。emacs の configure.in は修正されるべき。

コードを直し、上流の開発者に報告するのが、上記の問題の最良の修正方法だ。

--as-needed

正確に修正して上流の開発者に報告するのは骨が折れるし時間もかかる。--as-needed を使うのが簡単な直し方だ。Mandriva では2008年5月から広域の(global) --as-needed が使われている。

--as-needed で生じる問題
下潜結合のライブラリ(underlinked)

--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) を見てほしい。

参考
PR

firefox、flashplayer、グループ、ユーザ

firefox を自分で構築した時、plugins フォルダに作成した libflashplayer.so の複製やシンボリックリンクがうまく動かなかった。所属、使用者を root に変更するとそれなりに動くようになった。使った命令は「chown -h root:root XXX/libflashplayer.so」。


出典:How to install Flash Player 9 on SUSE Linux Enterprise Desktop 10


環境

SUSE Linux Enterprise Desktop 10


問題

**重要**この技術情報文書の説明は SUSE Linux Enterprise Desktop 10 の利用者だけが必要とするものである。Adobe Flash Player 9 は SUSE Linux Enterprise 10 の SP1 と SP2 で既に配信されており、SP1、SP2 双方に元からインストールされている。

ソフトウェア自動更新やオフラインの媒体を使って、SLED 10 SP2 にアップグレードすることを強く勧めるが、すぐに SP2 に更新できない場合に備えて以下の情報を著す。


解決方法
  1. SLED 10 で Firefox を使って「http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash」に行き、プルダウン・メニューをクリックして「.rpm for Linux」を選択。使用許諾を読んだ後、「Agree and install now」(同意してインストール)を押す。
  2. ダウンロードのダイアログ・ボックスが表示されたら、ラジオボタン型選択肢の「Open with zen-installer (default)」を選んで、OK をクリック。
  3. 入力を促されたら、管理者(root)のパスワードを打ち込む。
  4. ソフトウェア・インストーラの窓が表示されたら、「Install」を押す。
  5. ターミナルの窓を開き、「su」と入力し、管理者(root)としてログインする。
  6. 古い flash plugin の名前を「/usr/lib/browser-plugins/libflashplayer.so」から「 /usr/lib/browser-plugins/libflashplayer.v7」に変更。
    mv /usr/lib/browser-plugins/libflashplayer.so /usr/lib/browser-plugins/libflashplayer.v7
  7. firefox plugins ディレクトリにある新しい「libflashplayer.so」の複製を SLED のbrowser plugins ディレクトリに作る。
    cp /usr/lib/firefox/plugins/libflashplayer.so /usr/lib/browser-plugins/
  8. ファイルのグループとユーザを両方とも「root」(管理者)にする。
    chown root.root libflashplayer.so(訳者の環境では root:root)
    chmod 755 libflashplayer.so
  9. 現在開かれている全ての firefox の窓を閉じ、新しい firefox の窓を起動する。
  10. URL 欄に「about:plugins」と打ち込むと Flash Player が 7.x から 9.0 に変わっていることが確認できる。

Shockwave Flash
File name: libflashplayer.so
Shockwave Flash 9.0 r124
MIME TypeDescriptionSuffixesEnabled
application/x-shockwave-flash Shockwave Flash swf Yes
application/futuresplash FutureSplash Player spl Yes

カレンダー

06 2025/07 08
S M T W T F S
2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

最新コメント

[09/07 NONAME]
[08/18 NONAME]
[05/18 NONAME]
[04/09 NONAME]
[03/21 NONAME]

最新記事

(07/01)
(01/10)
(01/03)
(12/20)
(12/08)
(11/20)
(10/30)
(10/24)
(09/20)
(09/16)
(09/11)
(09/03)
(09/02)
(08/27)
(08/17)
(07/31)
(07/30)
(07/19)
(07/13)
(05/02)
(03/17)
(11/01)
(07/20)
(05/17)
(04/20)

ブログ内検索

広告

バーコード

広告