nmは、ライブラリからシンボルが削除されていない場合にのみ機能します。ただし、nm -D
いくつかの情報が表示される可能性があります。
nm -D /lib/libgcc_s.so.1
しかし、あなたを助けることができる別のツールがあります:readelf
readelf-ELFファイルに関する情報を表示します。
また、マニュアルページを確認する場合は、オプション-s:Displays the entries in symbol table section of the file, if it has one.
readelf -s /lib/libgcc_s.so.1
編集:
nmで検査しているオブジェクト内に実装されていないシンボルは、その前にUフラグが付いて表示されますが、nmは、システム上のどのライブラリがそのシンボルを実装しているかを示しません。
したがって、探しているものは、おそらくlddとnmの混合で達成できます。lddは、アプリケーションがリンクされているライブラリを示し、nmは、未定義(Uフラグ)またはローカルに実装されている(Tフラグ)シンボルを示します。
ターゲットアプリケーションですべての未定義のシンボル(nmを含む)を一覧表示した後、それらのシンボルを検索するためにlddによって報告されたすべてのライブラリを反復処理する必要があります(再度nmを使用)。シンボルを見つけ、その前にTフラグが付いている場合は、それを見つけました。
ちなみに、私は自分の考えを説明するために、bash用にこのワンライナーを書いたところです。winという名前のアプリケーションを分析し、未定義として報告されたすべてのシンボルを実装するライブラリを見つけようとします。
target="win"; for symbol in $(nm -D $target | grep "U " | cut -b12-); do for library in $(ldd $target | cut -d ' ' -f3- | cut -d' ' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo "Found symbol: $symbol at [$library]"; fi ; done; done; done;
または、端末が色をサポートしている場合:
target="win"; for symbol in $(nm -D $target | grep "U " | cut -b12-); do for library in $(ldd $target | cut -d ' ' -f3- | cut -d' ' -f1); do for lib_symbol in $(nm -D $library | grep "T " | cut -b12-); do if [ $symbol == $lib_symbol ]; then echo -e "Found symbol: \e[1;36m$symbol\033[0m at \e[1;34m$library\033[0m"; fi ; done; done; done;
誰かがパフォーマンスの向上を見つけると確信しています。
出力:
Found symbol: XCreateColormap at [/usr/lib/libX11.so.6]
Found symbol: XCreateWindow at [/usr/lib/libX11.so.6]
Found symbol: XIfEvent at [/usr/lib/libX11.so.6]
Found symbol: XMapWindow at [/usr/lib/libX11.so.6]
Found symbol: XOpenDisplay at [/usr/lib/libX11.so.6]
Found symbol: __libc_start_main at [/lib/tls/i686/cmov/libc.so.6]
Found symbol: __stack_chk_fail at [/lib/tls/i686/cmov/libc.so.6]
Found symbol: glClear at [/usr/lib/mesa/libGL.so.1]
Found symbol: glClearColor at [/usr/lib/mesa/libGL.so.1]
Found symbol: glFlush at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXChooseFBConfig at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXChooseVisual at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateContext at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateNewContext at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXCreateWindow at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXGetVisualFromFBConfig at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXMakeContextCurrent at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXMakeCurrent at [/usr/lib/mesa/libGL.so.1]
Found symbol: glXQueryVersion at [/usr/lib/mesa/libGL.so.1]