共有オブジェクトライブラリで定義されている関数のリストを取得したり、特定の関数が定義されているかどうかを調べるにはどうすればよいですか?
共有オブジェクトライブラリで定義されている関数のリストを取得したり、特定の関数が定義されているかどうかを調べるにはどうすればよいですか?
回答:
* nixシステムにはさまざまな実行可能ファイル形式があります。a.outは数年前に一般的な形式でしたが、今日では近くのすべての主要システムでELFが使用されています。
ELFは、各ファイルデータセクションを記述するヘッダーで構成されます。
探している部分は、各シンボル(関数、変数)がそのアドレスにマップされているシンボルテーブルです。
共有ライブラリは、.dynsymというセクションにグローバルシンボルを保持します
探しているのは、このセクションの関数型のシンボルとグローバルバインディングです。
readelf --syms ./libfoo.so
シンボルの出力が得られます。
SolarisおよびFreeBSDでもelfdump
利用可能です。
objdump
オブジェクトファイルに関する多くの情報も表示され、-j
スイッチを使用してセクションを指定できます。
-D(動的)スイッチでnmを使用します。
$ nm -D /usr/lib/libpng.so
00000000 A PNG12_0
w _Jv_RegisterClasses
w __cxa_finalize
U __fprintf_chk
w __gmon_start__
U __longjmp_chk
U __memcpy_chk
U __snprintf_chk
U __stack_chk_fail
U _setjmp
U abort
U crc32
U deflate
U deflateEnd
U deflateInit2_
U deflateReset
U fflush
U fread
U free
U fwrite
U gmtime
U inflate
U inflateEnd
U inflateInit_
U inflateReset
U malloc
U memcmp
U memcpy
U memset
00003fd0 T png_access_version_number
00016ef0 T png_build_grayscale_palette
00004810 T png_check_sig
0001d2d0 T png_chunk_error
0001d070 T png_chunk_warning
00013390 T png_convert_from_struct_tm
00014a90 T png_convert_from_time_t
000048d0 T png_convert_to_rfc1123
000051b0 T png_create_info_struct
00013040 T png_create_read_struct
00012c20 T png_create_read_struct_2
00014a40 T png_create_write_struct
00014710 T png_create_write_struct_2
00004230 T png_data_freer
00005140 T png_destroy_info_struct
00010eb0 T png_destroy_read_struct
00013da0 T png_destroy_write_struct
0001d0f0 T png_error
0001ca10 T png_free
00004a50 T png_free_data
0001c9d0 T png_free_default
...