您的位置:首页 > 运维架构 > Linux

每天回顾linux命令(nm)

2017-11-08 10:03 330 查看
nm命令是在开发过程中比较可能用到的linux命令。

nm命令

nm命令用于显示二进制目标文件的符号表。

提示:由于一般情况下,应用用nm打印出来的符号比较多,不利于观看,这里就哪一个.o文件来演示

语法

nm (选项) (参数) 或者 nm (参数) (选项)

选项

不加参数:打印出二进制文件代码段的符号。

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm  notify.o
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000250 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen


-a或者–debug-syms:只显示debug符号,会显示各种段,如bss段、data段等。

0000000000000000 b .bss
0000000000000000 n .comment
0000000000000000 d .data
0000000000000000 N .debug_abbrev
0000000000000000 N .debug_aranges
0000000000000000 N .debug_info
0000000000000000 N .debug_line
0000000000000000 N .debug_loc
0000000000000000 N .debug_str
0000000000000000 r .eh_frame
0000000000000000 n .note.GNU-stack
0000000000000000 r .rodata
0000000000000000 r .rodata.str1.1
0000000000000000 t .text
0000000000000000 t .text.unlikely
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000000 a notify.c
0000000000000250 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen


-A:打印是在符号前显示文件名

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm -A notify.o
notify.o:                 U __stack_chk_fail
notify.o:                 U createObject
notify.o:                 U createStringObject
notify.o:                 U decrRefCount
notify.o:00000000000000b0 T keyspaceEventsFlagsToString
notify.o:0000000000000000 T keyspaceEventsStringToFlags
notify.o:                 U ll2string
notify.o:0000000000000250 T notifyKeyspaceEvent
notify.o:                 U pubsubPublishMessage
notify.o:                 U sdscatlen
notify.o:                 U sdscatsds
notify.o:                 U sdsempty
notify.o:                 U sdsnewlen
notify.o:                 U server
notify.o:                 U strlen


-D:只显示动态库符号(与位置无关)

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm -D  notify.o
nm: notify.o: no symbols


用一个.so看看:

root@68fc0a9bc6dd:/usr/lib# nm -D libau.so
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
000000000020414c B __bss_start
w __cxa_finalize
U __errno_location
U __fprintf_chk
w __gmon_start__
U __stack_chk_fail
U __xstat
000000000020414c D _edata
00000000002041f0 B _end
0000000000002a0c T _fini
00000000000011e0 T _init
U calloc
U close
0000000000001dce T closedir
...


–defined-only:只显示已经定义了的符号

在动态库中使用:

root@68fc0a9bc6dd:/usr/lib# nm --defined-only libau.so
nm: libau.so: no symbols


在静态编译结果中使用:

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm --defined-only notify.o
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
0000000000000250 T notifyKeyspaceEvent


-f或–format=FORMAT:规定输出的格式,FORMAT可以为bsd、sysv、和posix。默认为bsd

bsd格式:

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm  notify.o
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000250 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen


posix格式:

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm  notify.o -f posix
__stack_chk_fail U
createObject U
createStringObject U
decrRefCount U
keyspaceEventsFlagsToString T 00000000000000b0 0000000
10ffb
000000197
keyspaceEventsStringToFlags T 0000000000000000 00000000000000a6
ll2string U
notifyKeyspaceEvent T 0000000000000250 00000000000001ce
pubsubPublishMessage U
sdscatlen U
sdscatsds U
sdsempty U
sdsnewlen U
server U
strlen U


sysv格式:

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm  notify.o -f sysv

Symbols from notify.o:

Name                  Value           Class        Type         Size             Line  Section

__stack_chk_fail    |                |   U  |            NOTYPE|                |     |*UND*
createObject        |                |   U  |            NOTYPE|                |     |*UND*
createStringObject  |                |   U  |            NOTYPE|                |     |*UND*
decrRefCount        |                |   U  |            NOTYPE|                |     |*UND*
keyspaceEventsFlagsToString|00000000000000b0|   T  |              FUNC|0000000000000197|     |.text
keyspaceEventsStringToFlags|0000000000000000|   T  |              FUNC|00000000000000a6|     |.text
ll2string           |                |   U  |            NOTYPE|                |     |*UND*
notifyKeyspaceEvent |0000000000000250|   T  |              FUNC|00000000000001ce|     |.text
pubsubPublishMessage|                |   U  |            NOTYPE|                |     |*UND*
sdscatlen           |                |   U  |            NOTYPE|                |     |*UND*
sdscatsds           |                |   U  |            NOTYPE|                |     |*UND*
sdsempty            |                |   U  |            NOTYPE|                |     |*UND*
sdsnewlen           |                |   U  |            NOTYPE|                |     |*UND*
server              |                |   U  |            NOTYPE|                |     |*UND*
strlen              |                |   U  |            NOTYPE|                |     |*UND*


-g或者–extern-only:只显示extern符号

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm -g notify.o
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000250 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen


-l或者–line-numbers:显示符号所在的文件的位置(跟实用)

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm -l notify.o
U __stack_chk_fail     /home/wzm/redis-4.0.2/src/notify.c:130
U createObject /home/wzm/redis-4.0.2/src/notify.c:113
U createStringObject   /home/wzm/redis-4.0.2/src/notify.c:104
U decrRefCount /home/wzm/redis-4.0.2/src/notify.c:129
00000000000000b0 T keyspaceEventsFlagsToString  /home/wzm/redis-4.0.2/src/notify.c:67
0000000000000000 T keyspaceEventsStringToFlags  /home/wzm/redis-4.0.2/src/notify.c:40
U ll2string    /home/wzm/redis-4.0.2/src/notify.c:109
0000000000000250 T notifyKeyspaceEvent  /home/wzm/redis-4.0.2/src/notify.c:95
U pubsubPublishMessage /home/wzm/redis-4.0.2/src/notify.c:114
U sdscatlen    /home/wzm/redis-4.0.2/src/notify.c:83
U sdscatsds    /home/wzm/redis-4.0.2/src/notify.c:112
U sdsempty     /home/wzm/redis-4.0.2/src/notify.c:70
U sdsnewlen    /home/wzm/redis-4.0.2/src/notify.c:108
U server       /home/wzm/redis-4.0.2/src/notify.c:102
U strlen       /home/wzm/redis-4.0.2/src/notify.c:104


-n或者–numeric-sort:符号按照地址大小排列

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm  -n notify.o
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
U ll2string
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen
0000000000000000 T keyspaceEventsStringToFlags
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000250 T notifyKeyspaceEvent


**-o:和-A一致

-p或者–no-sort:不排列符号(默认)

-P或者–portability:和-f posix一致

-r:反向排序符号列表**

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm  -r notify.o
U strlen
U server
U sdsnewlen
U sdsempty
U sdscatsds
U sdscatlen
U pubsubPublishMessage
0000000000000250 T notifyKeyspaceEvent
U ll2string
0000000000000000 T keyspaceEventsStringToFlags
00000000000000b0 T keyspaceEventsFlagsToString
U decrRefCount
U createStringObject
U createObject
U __stack_chk_fail
root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm notify.o
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000250 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen


**–plugin NAME:加载特定的动态库

-S或者–print-size:打印出符号的大小**

0000000000000000 00000000000000a6 T keyspaceEventsStringToFlags
U ll2string
0000000000000250 00000000000001ce T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen
root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000250 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen


–size-sort:按照符号大小排序(大小为0的不显示)

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o --size-sort
00000000000000a6 T keyspaceEventsStringToFlags
0000000000000197 T keyspaceEventsFlagsToString
00000000000001ce T notifyKeyspaceEvent


-t或者–radix=RADIX:按照指定进制显示符号地址:

其中d表10进制(默认)、x表示16进制、o表示八进制。

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o -t d
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
0000000000000176 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000592 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen
root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o -t x
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000250 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen


-u:显示没有定义的符号(重要)

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm -u   notify.o
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
U ll2string
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen
root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o
U __stack_chk_fail
U createObject
U createStringObject
U decrRefCount
00000000000000b0 T keyspaceEventsFlagsToString
0000000000000000 T keyspaceEventsStringToFlags
U ll2string
0000000000000250 T notifyKeyspaceEvent
U pubsubPublishMessage
U sdscatlen
U sdscatsds
U sdsempty
U sdsnewlen
U server
U strlen


参数

目标文件:二进制目标文件,通常是库文件和可执行文件。

显示结果字段按照如下第一行对号入座即可,注意默认格式按照符号地址、符号类型、符号名为一行。没有显示符号大小和符号段:

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o -f sysv

Symbols from notify.o:

Name                  Value           Class        Type         Size             Line  Section

__stack_chk_fail    |                |   U  |            NOTYPE|                |     |*UND*
createObject        |                |   U  |            NOTYPE|                |     |*UND*
createStringObject  |                |   U  |            NOTYPE|                |     |*UND*
decrRefCount        |                |   U  |            NOTYPE|                |     |*UND*
keyspaceEventsFlagsToString|00000000000000b0|   T  |              FUNC|0000000000000197|     |.text
keyspaceEventsStringToFlags|0000000000000000|   T  |              FUNC|00000000000000a6|     |.text
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: