1

nmの出力には多くのシステム変数があり、次のようになります

N
_CRT_MT
_CRT_fmode
_CRT_glob
Dictionary::variable4
namespace1::variable1
__cpu_features
__crt_xc_end__
__crt_xc_start__
__crt_xi_end__
__crt_xi_start__
__crt_xl_start__
__crt_xp_end__
__crt_xp_start__
__crt_xt_end__
__crt_xt_start__
__tls_end__
__tls_start__
__xl_a
__xl_c
__xl_d
__xl_z
_argc
_argv
_bss_end__
_bss_start__
_data_end__
_data_start__
_end__
_fmode
_tls_end
_tls_index
_tls_start
_tls_used
mingw_initltsdrot_force
mingw_initltsdyn_force
mingw_initltssuo_force
variable0
variable10

ユーザー定義の変数(この場合はvariable10、variable0、Dictionary :: variable1、Dictionary :: variable4、N)のみを出力することは可能ですか?

4

1 に答える 1

2

私が知っていることではありません。ただし、これらは実装用に予約されているため、少なくとも二重アンダースコアまたはアンダースコア + 大文字で始まるすべての変数を安全にフィルタリングできます。

$ nm -j foo | grep -v '^_[A-Z]\|^__\+[A-Za-z]'
N
Dictionary::variable4
namespace1::variable1
_argc
_argv
_bss_end__
_bss_start__
_data_end__
_data_start__
_end__
_fmode
_tls_end
_tls_index
_tls_start
_tls_used
mingw_initltsdrot_force
mingw_initltsdyn_force
mingw_initltssuo_force
variable0
variable10

実装定義の識別子を確実に示す追加のパターンを追加することで、おそらくさらにフィルタリングできます。

または、空の実行可能ファイル (つまり、ユーザー定義のシンボルを含まないnmもの) を作成し、次の方法で各実行可能ファイルの出力の差を計算しcommます。

$ # Preparation
$ echo 'int main() { }' > mt.cpp
$ g++ -o mt.out mt.cpp
$ nm -j mt.out > mt.symbols
$ 
$ nm -j your_exe > your_exe.symbols
$ comm -23 your_exe.symbols mt.symbols
N
Dictionary::variable4
namespace1::variable1
variable0
variable10
于 2012-08-13T13:26:19.407 に答える