2017-02-07 6 views
0

readelfがは、そのlibutil.so.1は、SSHユーティリティによって必要とされる報告:libutil、NMが言うようにreadelfがレポートはそれほど必要に応じてファイルが、ない機能(または他のシンボル)それから使用されている

$readelf -s /usr/bin/ssh | grep libutil 
0x0000000000000001 (NEEDED)    Shared library: [libutil.so.1] 

。 so.1はわずか6外部シンボルを持っています

$nm -D /lib64/libutil.so.1 | grep "T " 
000000331e0015a0 T forkpty 
000000331e000fa0 T login 
000000331e0010f0 T login_tty 
000000331e001190 T logout 
000000331e0012e0 T logwtmp 
000000331e0013d0 T openpty 

しかし、SSHから参照されていないこれらのシンボル:

$nm -D /usr/bin/ssh | grep forkpty 
$nm -D /usr/bin/ssh | grep login 
$nm -D /usr/bin/ssh | grep login_tty 
$nm -D /usr/bin/ssh | grep logout 
$nm -D /usr/bin/ssh | grep logwtmp 
$nm -D /usr/bin/ssh | grep openpty 

(grep not showing any matches) 

何が起こっていますか?なぜライブラリはNEEDEDとして参照されていますが、そこからのシンボルは使用されていませんか?これは一例にすぎません。私は他の実行可能ファイルの依存関係を分析しながら、このような "空の"参照の多くを満たしました。

+0

このアプリを作成したディストリビューションとは何ですか? – yugr

+0

ディストリビューションはRed Hat 6.6でしたが、問題はないと思います。 – spacistor

+0

それは、近代的なディストリビューションでは '--as-needed'がデフォルトで有効になっているので、問題を解決するために' --no-as-needed'を使う必要があります。 Redhat 6は(ただチェックされていても)うまくいくようです。 – yugr

答えて

2

DT_NEEDEDタグは、-lフラグに基づいてリンクエディタ(ld)によって生成されます。いくつかの例外を除いて、GNUリンクエディタや他の多くのエディタのデフォルトは、-lフラグが提供されるごとにDT_NEEDEDタグを作成することです。 GNU ldまたはgoldを使用している場合

、あなただけの実際に使用されているライブラリのためDT_NEEDEDタグを放出する-lフラグの前に--as-neededを渡すことができます。シンボルが実際に間接的に使用されている場合、これは明らかなタグを生成しません。

私は実際には--as-neededについてかなりの金額を書いていますし、それがどのように機能するのか、もっと興味がある場合はmy blog postsから見ることができます。

+0

"現代のディストリビューション(Ubuntu、Fedora、OpenSuse)では、デフォルトでGNUリンクエディタのデフォルトはDT_NEEDEDタグを作成しています" - is-neededは有効になっていませんか? – yugr

+0

それらのすべてを話すことはできませんが、Gentoo Linuxではまだデフォルトでは有効になっていません。少なくとも非ソフト版ではありません。私はそれが「金」にあるかもしれないと思う。 –

関連する問題