10
[root@xxx memcached-1.4.5]# objdump -R memcached-debug |grep freeaddrinfo
0000000000629e10 R_X86_64_JUMP_SLOT  freeaddrinfo

...

(gdb) disas freeaddrinfo
Dump of assembler code for function freeaddrinfo:
0x00000037aa4baf10 <freeaddrinfo+0>:    push   %rbp
0x00000037aa4baf11 <freeaddrinfo+1>:    push   %rbx
0x00000037aa4baf12 <freeaddrinfo+2>:    mov    %rdi,%rbx

だから私freeaddrinfoは動的にリンクされた関数であることを知っていますが、どのように.so定義されているかを知るにはどうすればよいですか?

4

3 に答える 3

8

この回答を参照してください。info symbol freeadrinfoを見つける方法の1 つです。

lddLinux および Solaris では、およびも使用できますLD_DEBUG=symbols。たとえば、localtimein/bin/dateがどこから来ているかを調べたい場合は、次のようにします。

LD_DEBUG=bindings ldd -r /bin/date 2>&1 |  grep localtime
     26322: binding file /bin/date [0] to /lib/libc.so.6 [0]: normal symbol `localtime' [GLIBC_2.2.5]
于 2011-04-06T14:21:35.197 に答える
0

ライブラリ ディレクトリ内で、次のコマンドを実行して、すべてのライブラリで特定のシンボルを検索できます。

for file in $(ls -1 *.so); do echo "-------> $file"; nm $file; done | c++filt | grep SYMBOL*

拡張バージョンは、( lddを介して) 実行可能ファイルにリンクされているすべてのライブラリを一覧表示し、シンボルがそこで定義されている場合は、一覧表示された各ライブラリを検索します。*nix によっては、カットの解析を微調整する必要がある場合があります。

APP=firefox; for symbol in $(nm -D $APP | grep "U " | cut -b12-); do for library in $(ldd $APP | 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;
于 2011-04-06T14:29:11.343 に答える