画像提供:マイナビニュース

写真拡大

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コマンドはそうした場合にも利用できるコマンドで、どのシンボルが使われているか調べることで問題解決へ向けた調査の一環とすることができる。普段から使うようなタイプのコマンドではないが、事前に知っておくと便利なコマンド。