HowtoForgeに2018年3月12日(米国時間)に掲載された記事「Linux nm Command Tutorial for Beginners (10 Examples)」が、macOS High SierraとUbuntsuにおけるnmコマンドの使い方を紹介した。nmコマンドはオブジェクトファイルのシンボル情報を表示するコマンド。システムレベルのソフトウェア開発をする場合に必要になるコマンドとされている。
紹介されているnmコマンドの主な使い方は次のとおり。
nmコマンドの基本的な実行例 - macOS High Sierra
# nm /bin/test
U __DefaultRuneLocale
U ___error
U ___maskrune
0000000100000000 T __mh_execute_header
U _abort
U _faccessat
U _getegid
U _geteuid
U _isatty
U _lstat$INODE64
U _setlocale
U _stat$INODE64
U _strcmp
U _strrchr
U _strtoimax
U _strtol
U _verrx
U dyld_stub_binder
#
ファイル名も表示 - macOS High Sierra
# nm -A /bin/test
/bin/test: U __DefaultRuneLocale
/bin/test: U ___error
/bin/test: U ___maskrune
/bin/test: 0000000100000000 T __mh_execute_header
/bin/test: U _abort
/bin/test: U _faccessat
/bin/test: U _getegid
/bin/test: U _geteuid
/bin/test: U _isatty
/bin/test: U _lstat$INODE64
/bin/test: U _setlocale
/bin/test: U _stat$INODE64
/bin/test: U _strcmp
/bin/test: U _strrchr
/bin/test: U _strtoimax
/bin/test: U _strtol
/bin/test: U _verrx
/bin/test: U dyld_stub_binder
#
出力形式をPOSIXへ変更 - macOS High Sierra
# nm -f posix /bin/test
__DefaultRuneLocale U 0 0
___error U 0 0
___maskrune U 0 0
__mh_execute_header T 100000000 0
_abort U 0 0
_faccessat U 0 0
_getegid U 0 0
_geteuid U 0 0
_isatty U 0 0
_lstat$INODE64 U 0 0
_setlocale U 0 0
_stat$INODE64 U 0 0
_strcmp U 0 0
_strrchr U 0 0
_strtoimax U 0 0
_strtol U 0 0
_verrx U 0 0
dyld_stub_binder U 0 0
#
外部シンボルのみを表示 - macOS High Sierra
# nm -g /bin/test
U __DefaultRuneLocale
U ___error
U ___maskrune
0000000100000000 T __mh_execute_header
U _abort
U _faccessat
U _getegid
U _geteuid
U _isatty
U _lstat$INODE64
U _setlocale
U _stat$INODE64
U _strcmp
U _strrchr
U _strtoimax
U _strtol
U _verrx
U dyld_stub_binder
#
未定義シンボルのみを表示 - macOS High Sierra
# nm --u /bin/test
__DefaultRuneLocale
___error
___maskrune
_abort
_faccessat
_getegid
_geteuid
_isatty
_lstat$INODE64
_setlocale
_stat$INODE64
_strcmp
_strrchr
_strtoimax
_strtol
_verrx
dyld_stub_binder
#
定義済みシンボルのみを表示 - macOS High Sierra
# nm --defined-only /bin/test
0000000100000000 T __mh_execute_header
#
ダイナミックシンボルのみを表示 - Ubuntu 16.04
# nm -D /usr/bin/test
U abort
U bindtextdomain
U calloc
U close
U __ctype_b_loc
U __ctype_get_mb_cur_max
U __cxa_atexit
U dcgettext
U __errno_location
U error
U error_at_line
U euidaccess
U exit
U _exit
U fclose
U fdopen
U fflush
U fileno
U __fpending
U __fprintf_chk
U fputs_unlocked
U __freading
U free
U fscanf
U fseeko
U fwrite
U getegid
U getenv
U geteuid
w __gmon_start__
U isatty
U iswprint
U __libc_start_main
U lseek
U __lxstat
U malloc
U mbrtowc
U mbsinit
U memcmp
U memcpy
U memset
U nl_langinfo
U open
U __printf_chk
000000000060b260 B __progname
000000000060b270 B __progname_full
000000000060b270 V program_invocation_name
000000000060b260 V program_invocation_short_name
U realloc
U setlocale
U __snprintf_chk
U __stack_chk_fail
000000000060b280 B stderr
000000000060b268 B stdout
U strcmp
U strlen
U strncmp
U strrchr
U strtol
U textdomain
U __uflow
U ungetc
U __xstat
#
ファイルシステムの不具合やパッケージ管理の不具合などでコマンドやソフトウェアが動作しなくなることがある。nmコマンドはそうした場合にも利用できるコマンドで、どのシンボルが使われているか調べることで問題解決へ向けた調査の一環とすることができる。普段から使うようなタイプのコマンドではないが、事前に知っておくと便利なコマンド。