zoukankan      html  css  js  c++  java
  • Linux的nm查看动态和静态库中的符号

    功能

    列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。

    使用

    nm [option(s)] [file(s)]

    有用的options:

    • -A 在每个符号信息的前面打印所在对象文件名称;
    • -C 输出demangle过了的符号名称;
    • -D 打印动态符号;
    • -l 使用对象文件中的调试信息打印出所在源文件及行号;
    • -n 按照地址/符号值来排序;
    • -u 打印出那些未定义的符号;

    常见的符号类型:

    • A 该符号的值在今后的链接中将不再改变;
    • B 该符号放在BSS段中,通常是那些未初始化的全局变量;
    • D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
    • T 该符号放在代码段中,通常是那些全局非静态函数;
    • U 该符号未定义过,需要自其他对象文件中链接进来;
    • W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

    注意几点:

    • -C 总是适用于c++编译出来的对象文件。还记得c++中有重载么?为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成一个mangle过的符号,那用这个选项列出符号的时候,做一个逆操作,输出那些原始的、我们可理解的符号名称。
    • 使用 -l 时,必须保证你的对象文件中带有符号调式信息,这一般要求你在编译的时候指定一个 -g 选项,见 Linux:Gcc
    • 使用nm前,最好先用Linux:File查看对象文件所属处理器架构,然后再用相应交叉版本的nm工具。

    举例

    更详细的内容见man page。这里举例说明:

    nm -u hello.o
    显示hello.o 中的未定义符号,需要和其他对象文件进行链接.
    nm -A /usr/lib/* 2>/dev/null | grep "T memset"

    在 /usr/lib/ 目录下找出哪个库文件定义了memset函数. 

    转自:http://itech.cnblogs.com/ 

  • 相关阅读:
    从汇编看c++对静态成员的存取
    从汇编看c++内联函数评估求值
    从汇编看c++初始化列表初始化成员变量
    53. sql2005“备份集中的数据库备份与现有的xx数据库不同”解决方法
    52. 查看linux系统是32位还是64位
    51. linux卸载jdk
    50. linux下查看tomcat日志
    49. jdk-6u45-linux-i586.bin安装步骤
    48. Linux 删除文件夹命令
    47. linux下给已经存在的用户设置用户组
  • 原文地址:https://www.cnblogs.com/bonelee/p/6524322.html
Copyright © 2011-2022 走看看