每天回顾linux命令(nm)

来源:互联网 发布:如何查看淘宝流量来源 编辑:程序博客网 时间:2024/06/07 20:19

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 decrRefCount00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000250 T notifyKeyspaceEvent                 U pubsubPublishMessage                 U sdscatlen                 U sdscatsds                 U sdsempty                 U sdsnewlen                 U server                 U strlen

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

0000000000000000 b .bss0000000000000000 n .comment0000000000000000 d .data0000000000000000 N .debug_abbrev0000000000000000 N .debug_aranges0000000000000000 N .debug_info0000000000000000 N .debug_line0000000000000000 N .debug_loc0000000000000000 N .debug_str0000000000000000 r .eh_frame0000000000000000 n .note.GNU-stack0000000000000000 r .rodata0000000000000000 r .rodata.str1.10000000000000000 t .text0000000000000000 t .text.unlikely                 U __stack_chk_fail                 U createObject                 U createStringObject                 U decrRefCount00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000000 a notify.c0000000000000250 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.onotify.o:                 U __stack_chk_failnotify.o:                 U createObjectnotify.o:                 U createStringObjectnotify.o:                 U decrRefCountnotify.o:00000000000000b0 T keyspaceEventsFlagsToStringnotify.o:0000000000000000 T keyspaceEventsStringToFlagsnotify.o:                 U ll2stringnotify.o:0000000000000250 T notifyKeyspaceEventnotify.o:                 U pubsubPublishMessagenotify.o:                 U sdscatlennotify.o:                 U sdscatsdsnotify.o:                 U sdsemptynotify.o:                 U sdsnewlennotify.o:                 U servernotify.o:                 U strlen

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

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

用一个.so看看:

root@68fc0a9bc6dd:/usr/lib# nm -D libau.so                 w _ITM_deregisterTMCloneTable                 w _ITM_registerTMCloneTable                 w _Jv_RegisterClasses000000000020414c B __bss_start                 w __cxa_finalize                 U __errno_location                 U __fprintf_chk                 w __gmon_start__                 U __stack_chk_fail                 U __xstat000000000020414c D _edata00000000002041f0 B _end0000000000002a0c T _fini00000000000011e0 T _init                 U calloc                 U close0000000000001dce T closedir...

–defined-only:只显示已经定义了的符号
在动态库中使用:

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

在静态编译结果中使用:

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm --defined-only notify.o00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags0000000000000250 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 decrRefCount00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000250 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 UcreateObject UcreateStringObject UdecrRefCount UkeyspaceEventsFlagsToString T 00000000000000b0 0000000000000197keyspaceEventsStringToFlags T 0000000000000000 00000000000000a6ll2string UnotifyKeyspaceEvent T 0000000000000250 00000000000001cepubsubPublishMessage Usdscatlen Usdscatsds Usdsempty Usdsnewlen Userver Ustrlen U

sysv格式:

root@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm  notify.o -f sysvSymbols 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|     |.textkeyspaceEventsStringToFlags|0000000000000000|   T  |              FUNC|00000000000000a6|     |.textll2string           |                |   U  |            NOTYPE|                |     |*UND*notifyKeyspaceEvent |0000000000000250|   T  |              FUNC|00000000000001ce|     |.textpubsubPublishMessage|                |   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 decrRefCount00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000250 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:12900000000000000b0 T keyspaceEventsFlagsToString  /home/wzm/redis-4.0.2/src/notify.c:670000000000000000 T keyspaceEventsStringToFlags  /home/wzm/redis-4.0.2/src/notify.c:40                 U ll2string    /home/wzm/redis-4.0.2/src/notify.c:1090000000000000250 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 strlen0000000000000000 T keyspaceEventsStringToFlags00000000000000b0 T keyspaceEventsFlagsToString0000000000000250 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 pubsubPublishMessage0000000000000250 T notifyKeyspaceEvent                 U ll2string0000000000000000 T keyspaceEventsStringToFlags00000000000000b0 T keyspaceEventsFlagsToString                 U decrRefCount                 U createStringObject                 U createObject                 U __stack_chk_failroot@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm notify.o                 U __stack_chk_fail                 U createObject                 U createStringObject                 U decrRefCount00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000250 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 ll2string0000000000000250 00000000000001ce T notifyKeyspaceEvent                 U pubsubPublishMessage                 U sdscatlen                 U sdscatsds                 U sdsempty                 U sdsnewlen                 U server                 U strlenroot@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o                 U __stack_chk_fail                 U createObject                 U createStringObject                 U decrRefCount00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000250 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-sort00000000000000a6 T keyspaceEventsStringToFlags0000000000000197 T keyspaceEventsFlagsToString00000000000001ce 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 decrRefCount0000000000000176 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000592 T notifyKeyspaceEvent                 U pubsubPublishMessage                 U sdscatlen                 U sdscatsds                 U sdsempty                 U sdsnewlen                 U server                 U strlenroot@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o -t x                 U __stack_chk_fail                 U createObject                 U createStringObject                 U decrRefCount00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000250 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 strlenroot@68fc0a9bc6dd:/home/wzm/redis-4.0.2/src# nm   notify.o                 U __stack_chk_fail                 U createObject                 U createStringObject                 U decrRefCount00000000000000b0 T keyspaceEventsFlagsToString0000000000000000 T keyspaceEventsStringToFlags                 U ll2string0000000000000250 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 sysvSymbols 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|     |.textkeyspaceEventsStringToFlags|0000000000000000|   T  |              FUNC|00000000000000a6|     |.text
原创粉丝点击