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 回答