nm命令
nm命令中符号类型详解
nm命令中符号类型详解nm命令介绍的很多,但大多不介绍其函数符号标志的含义。
最近在调试动态库时常用到,其中用的最多的用法:nm -A * |grep “aaa” | c++filt // -A 为了显示文件, c++filt 转换为可读风格,好像有个参数也能实现类似功能其他内容整理如下(原作者未知):nm用于列出目标文件的符号清单,如果没有指定目标文件,则默认为“a.out”。
nm的格式如下:nm [‘-a’|‘--debug-syms’] [‘-g’|‘--extern-only’][‘-B’] [‘-C’|‘--demangle’[=style]] [‘-D’|‘--dynamic’][‘-S’|‘--print-size’] [‘-s’|‘--print-armap’][‘-A’|‘-o’|‘--print-file-name’][‘--special-syms’][‘-n’|‘-v’|‘--numeric-sort’] [‘-p’|‘--no-sort’][‘-r’|‘--reverse-sort’] [‘--size-sort’] [‘-u’|‘--undefined-only’][‘-t’ radix|‘--radix=’radix] [‘-P’|‘--portability’][‘--target=’bfdname] [‘-f’format|‘--format=’format] [‘--defined-only’] [‘-l’|‘--line-numbers’] [‘--no-d emangle’][‘-V’|‘--version’] [‘-X 32_64’] [‘--help’] [objfile...]对于每一个符号,nm列出其值(the symbol value),类型(the symbol type)和其名字(the symbol name)。
如下例:00000024 T cleanup_before_linux00000018 T cpu_init00000060 T dcache_disable00000054 T dcache_enable0000006c T dcache_status00000000 T do_reset0000003c T icache_disable00000030 T icache_enable00000048 T icache_status上面的显示是使用nm cpu.o的输出,对于cleanup_before_linux这个符号来说,00000024是以16进制显示的其值,T为其类型,而cleanup_before_linux是其名字。
nm命令详解
nm命令详解
nm在linux中列出⽬标⽂件的符号清单,常⽤来查看动态链接库中的函数
nm⽀持的选项如下
-a 按照man⼿册,仅列出调试信息,实际上却是调试信息+正常信息
-A 增加⼀列显⽰⽬标⽂件,没有实际意义
-C 将低级符号信息编码成便于查看的⽤户信息,最终效果是符号清单呈现出class::memberfunction形式的信息,最常⽤的选项 -D 显⽰动态符号,以⽬标⽂件为so为例,显⽰了so中增加的符号信息以及so引⽤的so的符号信息
-f 指定不同的输出格式,改变命令输出格式
-g 仅显⽰外部符号,实测和-D选项输出⼏乎⼀样
-l 显⽰符号的⾏号,附加⼀列显⽰符号在xx⽂件的xx⾏定义较常⽤
-n 将符号按照地址进⾏排序
-p 不排序符号,使⽤该选项后的输出没有按照地址也没有按照符号名称排序
-r 逆序输出符号
-u 仅显⽰未定义符号,实测列出了GLIBC中的memset、memcpy等,不清楚具体作⽤
-h 显⽰帮助
-V 版本信息。
嵌入式系统程序设计(6章)赖晓晨
4. 共享库错误函数
函数原型: const char *dlerror(void); 功能描述:当动态链接库操作函数 (dlopen、dlsym、dlclose)执 行失败时,dlerror可以返回出错信息, 返回值为NULL时表示操作函数执行成 功。
【例6-2】
/* ch6_2 sub.h */ #ifndef SUB_H #define SUB_H int square(int); #endif /* ch6_2 sub.c */ #include <stdio.h> int square(int a) { printf("the square of the number is:"); return a*a; }
打开共享库(续)
功能描述:参数中的libname一般是库的绝对路径, 这样dlopen会直接装载该文件;如果只是指定了库名 称,在dlopen会按照下面的机制去搜寻:
根据环境变量LD_LIBRARY_PATH查找; 根据/etc/ld.so.cache查找; 依次在/lib和/usr/lib目录查找。
库分类
静态库,是在执行程序运行前就已经加入到执 行码中,在物理上成为执行程序的一部分。
共享库,是在执行程序启动时加载到执行程序 中,可以被多个执行程序共享使用。 动态链接库,其实并不是一种真正的库类型, 应该是一种库的使用技术,应用程序可以在运 行过程中随时加载和使用库。
库命名约定
所有库都以lib开头,表示一个库文件;
}
handle=dlopen("/lib/libmydll.so", RTLD_LAZY); if(!handle) { printf("%s\n",dlerror()); 如未找到函数,显 } 示error中的错误 fp=dlsym(handle, "square"); 信息 if((error=dlerror())!=NULL) { printf("%s\n",error); dlclose(handle); exit(1); } printf("now call the function square.\n"); result = (*fp)(n); printf(" %d\n",result); dlclose(handle); return 0;
macos nm 用法
macos nm 用法
在macOS 中,`nm` 是一个用于列出二进制文件中符号表的命令行工具。
它可以用来查看目标文件、共享库以及可执行文件中的符号信息。
`nm` 命令通常用于开发和调试过程中,以便了解二进制文件中包含的符号和函数。
以下是`nm` 命令的基本用法:
```bash
nm [option(s)] [file(s)]
```
其中,`option(s)` 是`nm` 命令的选项,`file(s)` 是要检查的二进制文件的名称。
常用的选项包括:
- `-n`:按数字顺序排序输出。
- `-p`:显示完整的符号信息,包括私有符号。
- `-m`:显示模块名称。
- `-j`:只显示符号的值,不显示符号名。
- `-U`:只显示未定义的符号。
- `-r`:递归地显示共享库中的符号。
例如,要查看一个名为`myapp` 的可执行文件中的符号表,可以使用以下命令:
```bash
nm -p myapp
```
这将列出`myapp` 中的所有符号信息,包括函数名、变量名等。
请注意,`nm` 命令的输出可能会非常庞大,尤其是在大型二进制文件中。
因此,你可能需要结合其他命令和筛选工具(如`grep`)来处理`nm` 命令的输出。
希望这能帮助你开始使用`nm` 命令。
如果你有特定的问题或需要更多信息,请随时告诉我。
nm命令详解
nm命令详解前⾔nm是name的缩写,它显⽰指定⽂件中的符号信息,⽂件可以是对象⽂件、可执⾏⽂件或对象⽂件库。
如果⽂件中没有包含符号信息,nm报告该情况,单不把他解释为出错。
nm缺省情况下报告⼗进制符号表⽰法下的数字值。
选项-a/--debug-syms:显⽰所有符号,包括debugger-only symbols-B:等同于 --format=bsd,兼容 MIPS nm-C/--demangle:将低级符号名解析成⽤户级名字。
这样可以使得C++函数名具有可读性。
--no-demangle:默认选项,不将低级符号名解析成⽤户级名字。
-D/--dynamic:显⽰动态符号。
这个选项只对动态⽬标(⽐如特定类型的共享库)有意义。
-f format/--format=format:使⽤format格式输出。
format可以选取bsd、sysv或posix,该选项在GNU的nm中有⽤。
默认为bsd-g/--extern-only:只显⽰外部符号-l/--line-numbers:对于每⼀个符号,使⽤debug信息找到⽂件名和⾏号。
-n/-v/--numeric-sort:按符号对应地址的顺序排序,⽽不是按符号名字符顺序排序-p/--no-sort:按照⽬标⽂件中遇到的符号顺序显⽰,不排序-P/--portability:按照POSIX2.0标准格式输出,等同于使⽤ -f posix-r/--reverse-sort:反转排序-s/--print-armap:当列出库中成员的符号时,包含索引。
索引的内容包括:哪些模块包含哪些名字的映射-u/--undefined-only:只显⽰未定义符号--defined-only:只显⽰定义的符号符号说明对于每⼀个符号来说,其类型如果是⼩写的,则表明该符号是local的。
⼤写则表明该符号是global(external)的A:该符号的值是绝对的,在以后的链接过程中,不允许改变。
nmcli命令
nmcli命令nmcli命令是可以完成⽹卡上的所有配置,并可以写⼊配置⽂件中。
在NM⾥,有2个维度:连接(connection)和设备(device),这是多对⼀的关系。
想给某个⽹卡配ip,⾸先NM要能纳管这个⽹卡。
设备⾥存在的⽹卡(即nmcli d可以看到的),就是NM纳管的。
接着,可以为⼀个设备配置多个连接(即nmcli c可以看到的),每个连接可以理解为⼀个ifcfg配置⽂件。
同⼀时刻,⼀个设备只能有⼀个连接活跃。
可以通过nmcli c up切换连接。
connection有2种状态:活跃(带颜⾊字体):表⽰当前该connection⽣效⾮活跃(正常字体):表⽰当前该connection不⽣效device有4种常见状态:connected:已被NM纳管,并且当前有活跃的connectiondisconnected:已被NM纳管,但是当前没有活跃的connectionunmanaged:未被NM纳管unavailable:不可⽤,NM⽆法纳管,通常出现于⽹卡link为down的时候(⽐如ip link set ensXX down)语法格式:nmcli [参数]常⽤参数:c,connection 查看连接d,device 查看设备1、显⽰设备接⼝详细信息nmcli d show2、启动关闭接⼝nmcli c up/down 接⼝名称(对应配置⽂件)nmcli c up ens32nmcli c down ens323、创建连接创建动态获取ip地址的连接 con-name是创建连接的名字,ifname是物理设备,⽹络接⼝nmcli connection add type ethernet con-name dhcp-eth0 ifname eth0创建静态ip地址连接 nmcli c add type ethernet con-name “连接名” ifname “⽹卡名” ip4 “ipv4地址/掩码” gw4 “⽹关”nmcli connection add type ethernet con-name ens32 ifname ens32 ip4 192.168.1.39/24 gw4 192.168.1.1 method autonmcli c add type ethernet con-name ens37 ifname ens37 ipv4.addr 192.168.1.200/24 ipv4.gateway 192.168.1.254 ipv4.method manualPS:上下两种格式效果⼀样。
4、gcc工具链nm符号工具简介
∙nm --列出目标文件(.o)的符号清单。
NND,太激动了。
刚知道此命令时让我三天没睡好觉。
我就使劲用了一把。
∙常用法:∙nm -s filename.a/filename.o/a.out 里边所有的符号列表一清二楚。
例:# nm -s a.out080495b8 A __bss_start08048334 t call_gmon_start080495b8 b completed.5751080494b8 d __CTOR_END__080494b4 d __CTOR_LIST__080495ac D __data_start080495ac W data_start08048450 t __do_global_ctors_aux08048360 t __do_global_dtors_aux080495b0 D __dso_handle080494c0 d __DTOR_END__080494bc d __DTOR_LIST__080494c8 d _DYNAMIC080495b8 A _edata080495bc A _end0804847c T _fini08048498 R _fp_hw08048390 t frame_dummy080484b0 r __FRAME_END__08049594 d _GLOBAL_OFFSET_TABLE_w __gmon_start__0804844c T __i686.get_pc_thunk.bx080482b8 T _init080494b4 a __init_array_end080494b4 a __init_array_start0804849c R _IO_stdin_used080494c4 d __JCR_END__080494c4 d __JCR_LIST__w _Jv_RegisterClasses080483e0 T __libc_csu_fini080483f0 T __libc_csu_initU __libc_start_main@@GLIBC_2.0080483b4 T main080495b4 d p.5749U puts@@GLIBC_2.008048310 T _start选项/属性:-a或--debug-syms:显示调试符号。
linux 提取so库函数的参数类型
linux 提取so库函数的参数类型
要提取Linux 上的共享库(.so 文件)中函数的参数类型,通常需要使用工具来进行符号查看(symbol lookup)或者反汇编(disassembly)。
以下是一些常用的工具和方法:
1. 使用nm 命令:nm 命令可以列出目标文件或共享库中的符号信息,包括函数名、变量名以及它们的类型。
您可以使用nm 命令来查看共享库中函数的参数类型。
例如:```bash
nm -D /path/to/your/library.so
```
2. 使用objdump 命令:objdump 命令可以对目标文件或共享库进行反汇编,您可以使用objdump 来查看函数的汇编代码,从中推断参数类型。
例如:
```bash
objdump -T /path/to/your/library.so
```
3. 使用readelf 命令:readelf 命令可以用来查看ELF 格式的目标文件和共享库的信息,包括符号表、段表等。
您可以使用readelf 来查看函数参数的类型信息。
例如:```bash
readelf -sW /path/to/your/library.so
```
请注意,提取函数参数类型需要一定的反汇编和符号查看技能,以及对ELF 文件格式的了解。
如果您只是需要获取某个库函数的参数类型,通常最简单的方法是查阅官方文档或者相关的API 参考资料。
Linux教程第7章 C语言开发工具
第7章C语言开发工具实验目的●学习理解Linux环境中将C程序转换成可执行文件所经历的过程●学习使用Linux环境中将C程序转换成可执行文件所采用的命令●学习使用indent、gcc、make、gdb命令实验指导Linux操作系统提供了非常好的编程环境,Linux系统支持多种高级语言。
C语言是Linux中最常用的系统编程语言之一,Linux内核绝大部分代码是用C语言编写的,Linux 平台上的相当多的应用软件也是用C语言开发的。
使用C语言,软件开发人员可以通过函数库和系统调用非常方便实现系统服务。
另外,还有很多有用的工具为程序开发和维护提供便利。
Linux操作系统拥有许多用于程序的生成以及分析的软件工具。
其中包括用于编辑和缩进代码、编译与连接程序、处理模块化程序、创建程序库、剖析代码、检验代码可移植性、源代码管理、调试、跟踪以及检测运行效率等等的工具。
在这一章里,我们将介绍一些常用的C语言工具,主要包括gcc、make工具。
make工具可以用来跟踪那些更新过的模块,并确保在编译时使用所有程序模块的最新版本。
7.1 编写程序的工具我们编写程序可以用Linux文本编辑器(如:pico编辑器、vi编辑器、gedit编辑器、emacs 编辑器和xemacs编辑器)。
我们首先使用vi 编辑器来编辑hello.c,这是一个C 语言的文件。
$ vi hello.c输入下列程序代码:#include <sdtio.h>#include <sdtlib.h>int main(){int i,j;for (i=0,j=10; i < j; i++){。
nmon命令
nmon 命令用途以交互方式显示本地系统统计信息并以记录方式记录系统统计信息。
语法交互方式:nmon [ -h ]nmon [ -s < seconds > ] [ -c < count > ] [ -b ] [ -B ] [ -g < filename > ] [ -k disklist ] [ -C < process1:process2:..:processN > ]记录方式:nmon [ -f | -F filename | -x | -X | -z ] [-r <runname > ] [ -t | -T |-Y ] [ -s seconds ] [ -c number ] [ -w number ] [ -l dpl ] [ -d ] [ -g filename ] [ -k disklist ] [ -C <process1:process2:..:processN > ] [ -G ] [ -K ] [ -o outputpath ] [ -D ] [ -E ] [ -J ] [ -V ] [-P ] [ -M ] [ -N ] [-W ] [ -S ] [-^ ] [ -O ] [-L ] [ -I percent ] [ -A ] [ -m <dir > ] [ -Z priority ]注:在记录方式下,仅指定-f、-F、-z、-x或-X标志的其中之一作为第一个参数。
描述nmon命令显示和记录本地系统信息。
此命令可以采用交互方式或记录方式运行。
如果指定-F、-f、-X、-x和-Z标志中的任何一个,那么nmon命令处于记录方式。
否则nmon命令处于交互方式。
nmon命令以交互方式提供下列视图:∙系统资源视图(使用r键)∙进程视图(使用t和u键)∙AIO 进程视图(使用A键)∙处理器使用情况小视图(使用c键)∙处理器使用情况大视图(使用C键)∙共享处理器逻辑分区视图(使用p键)∙NFS 面板(使用N键)∙网络接口视图(使用n键)∙WLM 视图(使用W键)∙磁盘繁忙情况图(使用o键)∙磁盘组(使用g键)∙ESS 虚拟路径统计信息视图(使用e键)∙JFS 视图(使用j键)∙内核统计信息(使用k键)∙长期处理器平均使用率视图(使用l键)∙大页分析(使用L键)∙调页空间(使用P键)∙卷组统计信息(使用V键)∙磁盘统计信息(使用D键)∙磁盘统计信息及图形(使用d键)∙内存和调页统计信息(使用m键)∙适配器I/O 统计信息(使用a键)∙共享以太网适配器统计信息(使用O键)∙冗余检查良好/警告/危险视图(使用v键)∙详细信息页统计信息(使用M键)∙光纤通道适配器统计信息(使用^键)在记录方式下,此命令会生成.nmon文件。
中国民航订座指令
一).航班信息查询指令(一)SK指令:显示航班时刻,查询一城市对在特定周期内所有航班的信息,包括航班号、出发到达时间、舱位、机型、周期和有效期限。
格式:SK 城市对三字代码/ 日期/ 航空公司二字代码/ 舱位例1:查询15MAR前后三天的一周时间内广州到北京的航班时刻〉SK:CANPEK/15OCT(航空公司二字代码和舱位可省略,表示查询所有信息)12MAR(MON)/18MAR(SUN) CANBJS1-CZ3101 CANPEK 0800 1110 77B 0 C E 22FEB24MAR FAPCDIJWZYTKHMGSL*2-以上显示信息中,分别为序号、航班号、航程、出发到达时间、机型、经停点、餐食、期限和舱位。
3-例2:显示14MAR前后三天从广州到北京的CZ的航班〉SK:CANPEK/14MAR/CZ例3:显示10MAR前后三天广州到上海的直达航班〉SK:CANSHA/10MAR/D(二)座位可利用情况显示A V——查询航班座位可利用情况,及其相关航班信息,如航班号、舱位、起飞到达时间、经停点等。
格式:A V城市对三字代码/ 日期/ 航空公司二字代码/ 舱位/ 座位数例1:显示10OCT的PEK到SHA航班座位可利用情况插入图片:〉A V:PEKSHA/10OCT(航空公司二字代码和舱位等可省略,表示查询所有信息)10OCT00(TUE)PEKSHA7+ FM106 PEKSHA 1815 2050 757 0 M DS# FA AS Y6 IS HS*以上显示信息中,分别为序号、航班号、航程、出发到达时间、机型、经停点、餐食、存取级别标识、舱位和座位可利用情况标识。
※座位可利用情况标识:A可利用座位数在10或10个以上;1~9 可利用座位个数数字显示;L 没有座位(只能候补);R 只能申请(需向其他航空公司申请且待答复);C 航班完全关闭;X 航班取消(不允许候补或申请);S 限制销售;例2:显示指定日期某航班的所有舱位〉A V:C/航班序号或〉A V:FM101/1DEC例3:显示指定日期直达航班〉A V:PEKCAN/1DEC/D*(三)航班经停点及起降时间显示FF:查询航班的经停城市,起降时间和机型。
dota地图命令大全
一、非娱乐版dota地图命令大全主要游戏模式常规模式:如果什么都不输入,15秒后自动默认常规模式。
玩家只能选择自己方酒馆的英雄全选模式:-ap/-allpick 玩家可以选择所有酒馆的英雄全体随机模式:-ar/-allrandom 玩家从所有酒馆的范围里自动随机得到一个英雄。
和反转模式不兼容。
团队随机模式: -tr/-teamrandom 玩家从自己方酒馆里随机得到一个英雄。
和反转模式、死亡竞赛模式不兼容。
模式随机: -mr/-moderandom 随机从全体随机模式,全选模式,团队随机模式和常规模式中选择一个模式。
和反转模式、死亡竞赛模式不兼容。
联赛模式: -lm/-leaguemode 需要10个玩家,团队交替选英雄,按(1-2-2-2-2-1)的顺序,第一玩家的团队是随机的。
每个玩家有20s选择一个英雄,否则随机产生一个英雄。
只能够选择自己方酒馆里的英雄。
除了以下二级模式外其他不兼容,例外:洗牌模式,交换禁止模式,禁止重选模式,雪地地形模式。
随机征召模式: -rd/-randomdraft 22个随机英雄从所有酒馆里选出来,并且放在地图左上的树林中。
然后玩家按照联赛模式选择这些英雄。
与镜像竞赛模式,死亡竞赛模式,全敏捷英雄模式,全智力英雄模式,全力量英雄模式,相同英雄模式,反转模式不兼容。
随机队长模式: -cd 22个随机英雄从所有酒馆里选出来,并且放在地图左上的树林中。
然后队长按照cm模式每方各ban掉2个英雄后开始选择这些英雄。
与镜像竞赛模式,死亡竞赛模式,全敏捷英雄模式,全智力英雄模式,全力量英雄模式,相同英雄模式,反转模式不兼容。
阵容投票模式: -vr/-voterandom 3种随机的阵容将被选择,每个玩家都可以投票。
需要两边玩家数相同才能使用此模式。
与镜像模式,死亡竞赛模式,全敏捷英雄模式,全智力英雄模式,全力量英雄模式,相同英雄模式,反转模式不兼容。
当随机阵容选举模式选择后,30秒内各个玩家可以投票,如果不投,将自动随机投,如果投票是平局,将随机选择一个选项。
yarn --kill原理
yarn --kill原理Yarn 杀死应用程序的原理Yarn 作为 Hadoop 生态系统中的资源管理器,负责管理和调度应用程序。
其任务之一是能够在需要时杀死应用程序。
原理Yarn 杀死应用程序的过程涉及以下步骤:向 RM 发送请求:客户端向资源管理器 (RM) 发送一个杀死应用程序的请求。
RM 验证请求:RM 验证请求,检查请求者是否有权杀死应用程序,以及应用程序是否仍在运行。
向 NM 发送命令:如果验证通过,RM 会向负责该应用程序的节点管理器 (NM) 发送一个命令,要求 NM 杀死该应用程序。
NM 执行命令:NM 收到命令后,会杀死应用程序的所有容器并释放其资源。
RM 确认杀死:RM 从 NM 收到确认后,会更新应用程序的状态并将其标记为已杀死。
细节杀死请求:杀死请求包含以下信息:应用程序 ID客户端凭证原因(可选)RM 验证:RM 会执行以下检查:检查客户端是否有权杀死应用程序。
验证应用程序仍在运行。
确保应用程序没有处于"TERMINATED"或"KILLED"状态。
命令发送:RM 会发送一个"KillApplication"命令到 NM,其中包含以下信息:应用程序 ID杀死原因(如果指定了)NM 执行:当 NM 收到命令时,它会:杀死应用程序的所有容器。
释放容器持有的资源。
向 RM 发送确认消息。
RM 确认:RM 收到 NM 的确认后,会:更新应用程序的状态。
将应用程序标记为已杀死。
附加说明如果 NM 无法杀死应用程序,RM 会重新安排杀死请求。
管理员可以通过配置 yarn.resourcemanager.kill.timeout参数来指定 NM 杀死应用程序的时间限制。
Yarn 还提供了一个命令行实用程序 yarn application -kill,用于方便地杀死应用程序。
nmcli基本命令
nmcli基本命令nmcli是Network Manager的命令行工具,用于管理和配置网络连接。
它提供了一系列的命令,可以方便地进行网络设置和管理。
本文将介绍nmcli的一些基本命令及其用法。
首先,我们需要了解一些基本的概念。
在nmcli中,网络连接被称为“连接(connection)”,每个连接都有一个唯一的名称。
连接的类型可以是以太网(ethernet)、Wi-Fi(wifi)、虚拟专用网络(vpn)等。
每个连接都有一组属性,如IP地址、子网掩码、网关等。
要查看当前的网络连接,可以使用命令“nmcli connection show”。
这将列出所有当前存在的连接,包括其名称、类型和设备。
例如,如果我们有一个以太网连接,其名称为“eth0”,可以使用命令“nmcli connection show eth0”来查看该连接的详细信息。
要创建一个新的连接,可以使用命令“nmcli connection add”。
例如,要创建一个以太网连接,可以使用以下命令:```nmcli connection add type ethernet con-name eth0 ifname eth0```其中,“type ethernet”表示连接类型为以太网,“con-name eth0”表示连接名称为“eth0”,“ifname eth0”表示连接的设备名称为“eth0”。
要编辑一个已存在的连接,可以使用命令“nmcli connection edit”。
例如,要编辑名为“eth0”的连接,可以使用以下命令:```nmcli connection edit eth0```这将打开一个交互式的编辑界面,可以在其中修改连接的属性。
例如,要修改IP地址,可以使用命令“set ipv4.addresses”。
例如,要将IP地址设置为“192.168.1.100”,可以使用以下命令:```set ipv4.addresses 192.168.1.100/24```要保存修改并退出编辑界面,可以使用命令“save”和“quit”。
linux下nm命令的使用
linux下nm命令的使⽤linux下强⼤的⽂件分析⼯具 -- nm什么是nmnm命令是linux下⾃带的特定⽂件分析⼯具,⼀般⽤来检查分析⼆进制⽂件、库⽂件、可执⾏⽂件中的符号表,返回⼆进制⽂件中各段的信息。
⽬标⽂件、库⽂件、可执⾏⽂件⾸先,提到这三种⽂件,我们不得不提的就是gcc的编译流程:预编译,编译,汇编,链接。
⽬标⽂件 :常说的⽬标⽂件是我们的程序⽂件(.c/.cpp,.h)经过预编译,编译,汇编过程⽣成的⼆进制⽂件,不经过链接过程,编译⽣成指令为:gcc(g++) -c file.c(file.cpp)将⽣成对应的file.o⽂件,file.o即为⼆进制⽂件库⽂件:分为静态库和动态库,这⾥不做过多介绍,库⽂件是由多个⼆进制⽂件打包⽽成,⽣成的.a⽂件,⽰例:ar -rsc liba.a test1.o test2.o test3.o将test1.o test2.o test3.o三个⽂件打包成liba.a库⽂件可执⾏⽂件:可执⾏⽂件是由多个⼆进制⽂件或者库⽂件(由上所得,库⽂件其实是⼆进制⽂件的集合)经过链接过程⽣成的⼀个可执⾏⽂件,对应windows下的.exe⽂件,可执⾏⽂件中有且仅有⼀个main()函数(⽤户程序⼊⼝,⼀般由bootloader指定,当然也可以改),⼀般情况下,⼆进制⽂件和库⽂件中是不包含main()函数的,但是在linux下⽤户有绝对的⾃由,做⼀个包含main函数的库⽂件也是可以使⽤的,但这不属于常规操作,不作讨论。
上述三种⽂件的格式都是⼆进制⽂件。
为什么要⽤到nm在上述提到的三种⽂件中,⽤编辑器是⽆法查看其内容的(乱码),所以当我们有这个需求(例如debug,查看内存分布的时候)去查看⼀个⼆进制⽂件⾥包含了哪些内容时,这时候就将⽤到⼀些特殊⼯具,linux下的nm命令就可以完全胜任(同时还有objdump和readelf⼯具,这⾥暂不作讨论)。
怎么使⽤nm如果你对linux下的各种概念还算了解的话,就该知道⼀般linux下的命令都会⾃带⼀些命令参数来满⾜各种应⽤需求,了解这些参数的使⽤是使⽤命令的开始。
熟悉binutils工具集(完整版)
需要注意的是,这不是一篇教你如何进行 Linux 程序开发的文章,相反,这里假设了你了解一 些基本的 Linux 命令。同样地,这篇文章不会告诉你什么时候要用 GCC 进行编译,而什么时候又得 用 G++进行编译,更不会告诉你这些编译器的具体参数的意思是什么以及如何使用。对于这些信息, 你需要参考其它的文章或是书籍。
安装包下载完了以后,你需要再次运行 setup.exe,且这次选择“从本地安装”。在安装时,
2█
同样不要忘了选择安装 GCC 和 binutils。
熟悉 binutils 工具集
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
十进制符号表示法。这是 nm 命令的缺省格式。
o
八进制符号表示法。
x
十六进制符号表示法。
-u 只显示未定义符号。
-v 按值而不是按字母表顺序排序输出。
-x 用十六进制而不是十进制数来显示符号的值和大小。
-X mode 指定 nm 应该检查的对象文件的类型。 mode 必须是下列之一:
f 源文件名称符号。
T Global text 符号。
t Local text 符号。
U 未定义符号。
值
大小
如果可应用,nm 命令报告与符号有关的大小。
标志
-A 每行或者显示全路径名称或者显示对象库名。
-B 在 Berkeley 软件分发(BSD)格式中显示输出:
值 类型 名称
Z
Weak bss 符号
-o 用八进制而不是十进制数来显示符号的值和大小。
-P 以标准可移植输出格式显示信息:
库/对象名 名称 类型 值 大小
该格式以十六进制符号表示法显示数字值,除非您用 -t、-d 或 -o 标志指定不同的格式。
如果您指定了 -A 标志 -P 标志只显示 库/对象名字段。同样,-P 标志只显示大小适用的符号大小字段。
符号名称
符号类型
nm 命令使用以下符号(用同样的字符表示弱符号作为全局符号)之一来表示文件符号类型:
A Global absolute 符号。
a Local absolute 符号。
B Global bss 符号。
b Local bss 符号。
D Global data 符号。
d Local data 符号。
用途
显示关于对象文件、可执行文件以 -C ] [ -X {32|64|32_64}] [ -f ] [ -h ] [ -l ] [ -p ] [ -r ] [ -T ] [ -v ] [ -B | -P ] [ -e | -g | -u ] [ -d | -o | -x | -t Format ] File ...
以十六进制显示符号大小和值并且按值排序符号,请输入:
nm -xv a.out
显示 libc.a 中所有 64 位对象符号,忽略所有 32 位对象:
nm -X64 /usr/lib/libc.a
文件
/usr/ccs/bin/nm 包含 nm 命令。
描述
nm 命令显示关于指定 File 中符号的信息,文件可以是对象文件、可执行文件或对象文件库。如果文件没有包含符号信息,nm 命令报告该情况,但不把它解释为出错条件。 nm 命令缺省情况下报告十进制符号表示法下的数字值。
nm 命令把以下符号信息写入标准输出:
库或对象名
如果您指定了 -A 选项,则 nm 命令只报告与该文件有关的或者库或者对象名。
-g 只显示外部的(全局)符号。
-h 限制输出头数据的显示。
-l 通过给 WEAK 符号的编码键附加一个 * 来区分 WEAK 和 GLOBAL 符号。如果和 -P 选项一起使用, WEAK 符号的符号类型显示如下:
V
Weak Data 符号
W
Weak Text 符号
w
Weak 未定义符号
-C 限制解码(demangle) C++ 名称。缺省是解码所有 C++ 符号名。
注:
C++ 对象文件中的符号在被使用前它们的名称已经被解码了。
-d 用十进制显示符号的值和大小。这是缺省的。
-e 只显示静态的和外部的(全局)符号。
-f 显示完整的输出,包括冗余的 .text、 .data 以及 .bss 符号,这些在通常都是被限制的。
-p 不排序。输出按符号表顺序打印。
-r 倒序排序。
-T 把可能会溢出它的列的每个名字截短,使显示的名字的最后一个字符是星号(*)。缺省情况下,nm 显示列出的符号的全名,并且一个比为其设置的列的宽度长的名称会引起名称后的每个列无法对齐。
-t Format 显示指定格式下的数字值,其中 Format 参数是以下符号表示法之一:
注:
nm 命令支持 -- (双连字符)标志。如果文件名会被曲解为一个选项,该标志区别于 File 操作数。例如,要指定文件名以连字符开始,请使用 -- 标志。
退出状态
该命令返回下列出口值:
0 成功完成。
>0 发生错误。
示例
列出 a.out 对象文件的静态和外部符号,请输入:
nm -e a.out
32
只处理 32 位对象文件
64
只处理 64 位对象文件
32_64
处理 32 位和 64 位对象文件
缺省是处理 32 位对象文件(忽略 64 位对象)。 mode 也可以 OBJECT_MODE 环境变量来设置。例如,OBJECT_MODE=64 使 nm 处理任何 64 位对象并且忽略 32 位对象。 -X 标志覆盖 OBJECT_MODE 变量。