编译项目记录几个常用的指令
创始人
2024-05-24 17:34:18
0

文章目录

    • 一、作用
      • 1)查看某个库是否有该符号表
      • 2)看哪个库需要哪些库,是否满足
      • 3)查看库信息,是否是32位还是64位
    • 二、补充解释
      • 1)nm出现的原因

一、作用

1)查看某个库是否有该符号表

linux 查看 *.a *.so 符号表

objdump -tT libName.so | grep symbel symbolName
nm -a libName.so | grep symbel symbolName

-A 或-o或 --print-file-name:打印出每个符号属于的文件
-a或--debug-syms:打印出所有符号,包括debug符号
-B:BSD码显示
-C或--demangle[=style]:对低级符号名称进行解码,C++文件需要添加
--no-demangle:不对低级符号名称进行解码,默认参数
-D 或--dynamic:显示动态符号而不显示普通符号,一般用于动态库
-f format或--format=format:显示的形式,默认为bsd,可选为sysv和posix
-g或--extern-only:仅显示外部符号
-h或--help:国际惯例,显示命令的帮助信息
-n或-v或--numeric-sort:显示的符号以地址排序,而不是名称排序
-p或--no-sort:不对显示内容进行排序
-P或--portability:使用POSIX.2标准
-V或--version:国际管理,查看版本
--defined-only:仅显示定义的符号,这个从英文翻译过来可能会有偏差,故贴上原文

2)看哪个库需要哪些库,是否满足

ldd -r 库名字

  • 解释
    ldd命令用于打印程序或者库文件所依赖的共享库列表。Glibc安装的库中有一个为ld-linux.so.X,其中X为一个数字,在不同的平台上名字也会不同。ldd不是一个可执行程序,而只是一个shell脚本
  • 举例
fan@carey:/$ ldd /bin/catlinux-vdso.so.1 (0x00007fff5cefb000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5412e04000)/lib64/ld-linux-x86-64.so.2 (0x00007f5412fff000)

3)查看库信息,是否是32位还是64位

file 动态库
objdump -a 静态库

  • objdump命令解释
--archive-headers 
-a 
显示档案库的成员信息,类似ls -l将lib*.a的信息列出。 -b bfdname 
--target=bfdname 
指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如: objdump -b oasys -m vax -h fu.o 
显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。 -C 
--demangle 
将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。 --debugging 
-g 
显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。 -e 
--debugging-tags 
类似-g选项,但是生成的信息是和ctags工具相兼容的格式。 --disassemble 
-d 
从objfile中反汇编那些特定指令机器码的section。-D 
--disassemble-all 
与 -d 类似,但反汇编所有section.-EB 
-EL 
--endian={big|little} 
指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records. -f 
--file-headers 
显示objfile中每个文件的整体头部摘要信息。-h 
--section-headers 
--headers 
显示目标文件各个section的头部摘要信息。  -H 
--help 
简短的帮助信息。 -i 
--info 
显示对于 -b 或者 -m 选项可用的架构和目标格式列表。 -j name
--section=name 
仅仅显示指定名称为name的section的信息 -l
--line-numbers 
用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。 -m machine 
--architecture=machine 
指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构. --reloc 
-r 
显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。 --dynamic-reloc 
-R 
显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。 -s 
--full-contents 
显示指定section的完整内容。默认所有的非空section都会被显示。-S 
--source 
尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。 --show-raw-insn 
反汇编的时候,显示每条汇编指令对应的机器码,如不指定--prefix-addresses,这将是缺省选项。 --no-show-raw-insn 
反汇编时,不显示汇编指令的机器码,如不指定--prefix-addresses,这将是缺省选项。 --start-address=address 
从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。 --stop-address=address 
显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出。 -t 
--syms 
显示文件的符号表入口。类似于nm -s提供的信息 -T 
--dynamic-syms 
显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D|--dynamic 显示的信息。 -V 
--version 
版本信息 --all-headers 
-x 
显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。 -z 
--disassemble-zeroes 
一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。
@file 可以将选项集中到一个文件中,然后使用这个@file选项载入。

二、补充解释

1)nm出现的原因

在上述提到的三种文件中,用普通编辑器是无法查看其内容的,而使用二进制读写软件也只能查看原始的未格式化数据,所以当我们有debug,查看二进制文件格式的时候,这时候就将用到一些特殊工具,linux下的nm命令就可以完全胜任(同时还有objdump和readelf工具,这里暂不作讨论)。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...