首页 > 系统相关 >Linux的nm查看动态和静态库中的符号

Linux的nm查看动态和静态库中的符号

时间:2023-07-19 15:14:39浏览次数:35  
标签:文件 nm 符号 对象 库中 Linux 链接

功能

列出.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函数. 

标签:文件,nm,符号,对象,库中,Linux,链接
From: https://www.cnblogs.com/lidabo/p/17565649.html

相关文章

  • Matplotlib库中,plt.figure()、plt.imshow()、plt.axis()和plt.show()、gca、savefig、
    在Matplotlib库中,plt.figure()、plt.imshow()、plt.axis()和plt.show()是用于绘制和显示图像的常用方法。下面是对每个方法的含义的解释:plt.figure():plt.figure()用于创建一个新的图形对象(Figure),它是绘图的最顶层容器。可以使用该对象进行图形的设置和操作,例如设置图形的大小......
  • Linux uevent分析、用户接收uevent以及mdev分析
    intmdev_main(intargc,char**argv)MAIN_EXTERNALLY_VISIBLE;intmdev_main(intargcUNUSED_PARAM,char**argv){RESERVE_CONFIG_BUFFER(temp,PATH_MAX+SCRATCH_SIZE);INIT_G();ifENABLE_FEATURE_MDEV_CONFG.filename="/etc/mdev.conf";endif......
  • Linux命令-按照与使用(17)(转载)解决同一台服务器上部署多个tomcat的同一个项目session冲
    ————————————————版权声明:本文为CSDN博主「strive_or_die」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/strive_or_die/article/details/103191546————————————————版权声明:本文为CS......
  • Linux系统Apache添加监听端口后无法启动服务并报错:Job for httpd.service failed beca
    导言:这是SELinux安全机制导致的。解决方法:1.查看当前httpd端口#semanageport-l|grephttp2.将对应端口加入SELinux,以8068为例#semanageport-a-thttp_port_t-ptcp80683.再次查看#semanageport-l|grephttp4.重启Apache服务#systemctlrestarth......
  • docker linux开机启动
    DockerLinux开机启动在Linux系统中,可以通过配置Docker来实现在开机时自动启动Docker服务。这样可以确保Docker服务在系统启动后自动运行,方便管理和使用Docker容器。本文将介绍如何设置Docker在Linux开机时自动启动,并提供相应的代码示例。方法一:使用systemd管理器systemd是一个L......
  • docker dev environment 用法
    DockerDevEnvironment用法简介在软件开发中,为了保证开发环境的一致性和隔离性,使用Docker来创建开发环境已经成为一种常见的做法。本文将向你介绍如何使用Docker构建开发环境,并教会你每一步需要做什么。步骤概览步骤描述1安装Docker2创建Dockerfile3......
  • docker compose报错environment array items[0,4] must be unique
    DockerCompose报错:environmentarrayitems[0,4]mustbeunique在使用DockerCompose进行容器编排时,有时候会遇到以下错误提示:environmentarrayitems[0,4]mustbeunique。这个错误发生在定义了重复的环境变量时,本文将详细解释这个错误的原因,并提供解决方案。DockerCompose......
  • Linux
    目录linux基础第1节1.1目录1.2shell是什么1.3linux命令1.4文件类型1.5ls第2节2.1alias别名机制2.2du磁盘使用情况2.3mkdir创建文件2.4touch2.5copy备份2.6find查找文件linux基础第1节1.1目录去往当前目录家目录cd~cdcd/root/cd/进......
  • linux压缩和解压
    1.压缩格式ziplinux,windows,MacOS7zipwindowsrarwindowstarlinux,MacOSgziplinux,MacOS.tar格式:简单的将文件组装到一个文件中,没有太多文件体积的减少,只是简单的封装.gz格式:使用gzip压缩算法将文件压缩到一个文件内,可以极大的减少压缩后的体积2.压缩命令针对.tar.g......
  • Linux配置IP地址
    目录修改配置文件重启网络服务相关命令查看路由状态route-n查看IP地址ipa查看网卡参数ethtoolens33查看DNS解析nslookup修改配置文件vi/etc/sysconfig/network-scripts/ifcfg-ens33配置解释TYPE=Ethernet#网卡类型是以太网PROXY_METHOD=noneBROWSER_ONLY=noBOO......