【Linux命令】nm查看动态库和静态库中的符号
功能
列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。
使⽤
nm [option(s)] [file(s)]
有⽤的options:
-A 在每个符号信息的前⾯打印所在对象⽂件名称;
-C 输出demangle过了的符号名称;
-D 打印动态符号;
-l 使⽤对象⽂件中的调试信息打印出所在源⽂件及⾏号;
-n 按照地址/符号值来排序;
-u 打印出那些未定义的符号;
常见的符号类型:
linux版本命令A 该符号的值在今后的链接中将不再改变;
B 该符号放在BSS段中,通常是那些未初始化的全局变量;
D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
T 该符号放在代码段中,通常是那些全局⾮静态函数;
U 该符号未定义过,需要⾃其他对象⽂件中链接进来;
W 未明确指定的弱链接符号;同链接的其他对象⽂件中有它的定义就⽤上,否则就⽤⼀个系统特别指定的默认值。
注意⼏点:
-C 总是适⽤于c++编译出来的对象⽂件。还记得c++中有重载么?为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成⼀个mangle过的符号,那⽤这个选项列出符号的时候,
做⼀个逆操作,输出那些原始的、我们可理解的符号名称。
使⽤ -l 时,必须保证你的对象⽂件中带有符号调式信息,这⼀般要求你在编译的时候指定⼀个 -g 选项,见。
使⽤nm前,最好先⽤查看对象⽂件所属处理器架构,然后再⽤相应交叉版本的nm⼯具。
举例
更详细的内容见man page。这⾥举例说明:
nm -u hello.o
显⽰hello.o 中的未定义符号,需要和其他对象⽂件进⾏链接.
nm -A /usr/lib/* 2>/dev/null | grep "T memset"
在 /usr/lib/ ⽬录下出哪个库⽂件定义了memset函数.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论