文章目录

  • 前言
  • 一、add2line
  • 二、strip
  • 三、ar
  • 四、nm
  • 五、objdump
  • 六、size
  • 七、strings
  • 总结

前言

本篇文章我们来介绍一些Linux开发中的辅助工具,有了这些辅助工具将会让我们的开发变的更加轻松。

一、add2line

addr2line是一个GNU调试工具,用于将程序计数器(PC)地址转换为对应的源文件名、函数名和行号。addr2line可通过调试信息,将内存地址映射到源代码行号,并在开发人员调试应用程序时帮助找到问题所在。addr2line通常与交叉编译器一起使用,用于在代码嵌入式或远程设备上汇报错误的处理信息。

addr2line的命令行参数语法为:

addr2line [-CfpHsvV] [-e filename] [-j section] [-a address] [address ...]

其中,参数说明如下:

-C: 此选项用于修复函数名。addr2line可以对编译器生成的能够适应C++的名称进行反向演绎,使名称更易于读取和理解。
-f: 此选项用于输出函数名称。
-p: 此选项用于调解指针地址为C++名称。
-H: 此选项用于输出全部文件名、函数名称、和行号。
-s: 此选项用于输出文件名和行号。
-v: 此选项用于详细输出,比如唯一的文件和否则可能无法报告的错误。
-V: 此选项用于输出程序版本信息。
-e filename: 此选项用于指定可执行文件。
-j section: 此选项用于指定要查找的节。
-a address: 此选项用于指定要查找的内存地址。
addr2line的常见应用场景包括:

追踪程序的异常:addr2line可以将地址解析为函数名和行号,用于追踪程序崩溃的原因,定位并修复异常。

函数调用跟踪:addr2line可以将函数调用的地址映射到对应的源代码中,用于跟踪和调试函数调用过程。

性能分析:addr2line可以将程序计数器地址转换为对应的文件名和行号,用于性能分析和代码优化。

下面举一个例子:

这里编写了一个错误的代码,下面我们使用addr2line来查找这段代码出错的位置。

#include <stdio.h>int* g_pointer;void fun()
{*g_pointer = (int)"Hello";
}int main(void)
{fun();return 0;}

编译代码并没有明显错误:

执行代码发生段错误:

生成了对应的core文件:

使用lldb查看内存错误地址:

二、strip

strip 是一个 Linux 系统下的命令行工具,可以用于去除可执行文件或共享库中的符号表和调试信息,从而减小文件大小。它通常在编译后的可执行文件优化和瘦身时被使用。由于符号表和调试信息比源代码更容易逆向工程,因此在发布生产环境时使用 strip 可以增强二进制文件的安全性。

使用 strip 命令的方式非常简单,通常只需要在终端中输入以下命令:

strip <file>

其中,file 是要去除符号表的可执行文件或共享库。

strip 去除符号表信息的方式是将可执行文件或共享库中的符号表和调试信息部分截取掉,因此在进行这个操作时需要特别小心,以免破坏二进制文件的完整性,导致其不能正常运行。在进行图像等文件压缩优化时,应谨慎选择去除的符号表信息。

示例:

#include <stdio.h>int main(void)
{printf("Ddebug\n");return 0;
}

编译程序查看程序大小:

使用strip去除调试信息后的大小:

三、ar

ar 是一个 Linux 系统下的命令行工具,用于创建、修改和提取静态库。它被包含在 binutils 工具包中,通常与 gcc 和 ld 等工具一起使用。静态库是一组已经编译好的二进制模块文件的集合,包含一组函数和数据结构等。

ar 的基本用法是将多个目标文件(通常是 .o 或 .a 格式)打包成一个静态库,该静态库的文件扩展名通常是 .a。创建一个静态库可以使用以下命令:

首先编写两个文件一个test.c和fun.c文件:

test.c:

extern void func(void);int main(void)
{func();return 0;
}

fun.c:

#include <stdio.h>void func(void)
{printf("func\n");
}

生成.o文件:

将.o文件编译成静态库:
这里就生成了libtest.a这个静态库了:

既然可以生成静态库那么肯定就可以将静态库解压出来了:

使用ar x可以将生成的静态库解压出来。

四、nm

nm 是一个 Linux 系统下的命令行工具,用于显示二进制目标文件(可执行文件或库文件)中的符号(Symbol),包括函数和变量名等。

nm 可以用于检查二进制文件的符号表信息,它可以列出二进制文件中包含的所有符号、这些符号所处的节(节是编译后二进制文件中包含的一个段)以及它们的类型(如函数、变量等)。nm 常用于调试和检查程序的二进制文件。

nm 命令的常见用法如下:

nm <file>:查看文件(如可执行文件或库文件)中包含的所有符号。

nm -u <file>:列出未定义符号的名称,这些符号是需要在连接时动态解析的符号,通常需要通过静态或共享库来定义。

nm -g <file>:只列出全局符号的名称,全局符号是可被其他模块所引用的符号,多次定义时会引发重定义错误。

nm -D <file>:只列出动态符号的名称,动态符号是在动态链接时解析的符号,如共享库中导出的符号。

nm -C <file>:将 C++ 操作符和函数名还原为可读的形式。

输出结果由三部分组成:
地址,段,标识符

nm输出标识符的含义:
T:该符号是一个函数,并且是在该文件中定义的。

t:该符号是一个函数,并且是在该文件中局部定义的(即只能在该文件中访问)。

D:该符号是一个已初始化的全局变量或静态变量,并且是在该文件中定义的。

d:该符号是一个已初始化的局部变量或静态变量,并且是在该文件中定义的。

B:该符号是一个未初始化的全局变量或静态变量,并且是在该文件中定义的。

b:该符号是一个未初始化的局部变量或静态变量,并且是在该文件中定义的。

U:该符号是一个未定义的符号,需要在链接时解析,通常是在其他文件或库文件中被定义的符号。

五、objdump

objdump 是一个 Linux 系统下的命令行工具,可以用于显示目标文件(可执行文件或共享库)的可读汇编代码、符号表、段信息等。这个工具通常在调试和逆向工程中使用,可用于分析二进制文件的结构和行为。

objdump 命令的常见用法如下:

objdump -d :显示文件中的可读汇编代码,包括已编译的程序和函数等。

objdump -t :显示文件的符号表,包括函数、变量等信息。

objdump -h :显示文件的段表,包括段的名称、大小、虚拟地址、文件偏移等信息。

objdump -x :显示文件的所有头部信息,包括 ELF 头、程序头、段头等。

使用示例:
objdump -d

dis文件内容:

objdump -h

输出结果:

六、size

size 是一个 Linux 系统下的命令行工具,用于显示可执行文件或共享库的代码段、数据段和未初始化的数据段等占用的空间大小。size 命令的输出结果分别显示程序代码、数据段和未初始化数据段占用的字节数、十六进制字节大小以及百分比大小。

size 命令的常见用法如下:

size :显示指定文件的大小信息,包括 .text(代码段)、.data(数据段)和 .bss(未初始化的数据段)三个部分。

size -A :显示指定文件的对齐大小,即程序头或段头按照规则对齐后占用的空间。

size -d :只显示数据段和未初始化的数据段的大小。

size -t :只显示代码段的大小。

使用示例:

七、strings

strings 是一个 Linux 系统下的命令行工具,用于从二进制文件中提取可打印字符串。这个工具通常用于查找二进制文件中的常量字符串、密码以及其他敏感信息。

strings 命令的常见用法如下:

strings <file>:从指定的文件中提取可打印字符串。

strings -n :设置最小字符串长度,只输出长度不小于指定长度的字符串。例如 strings -n 8 a.out 只会输出长度不小于 8 的字符串。

strings -a :显示所有字符串,包括未打印的字符。

strings -t :指定输出字符串的编码格式,常用的格式有 s、d、o、x,分别代表 ASCII、十进制、八进制和十六进制格式。

使用示例:

#include <stdio.h>int main(void)
{char* p = "Hello";char* p1 = "World";return 0;}

总结

本篇文章就介绍到这里了,这些工具在我们嵌入式Linux开发还是比较有用的,希望大家可以好好掌握。

Linux开发中的辅助工具相关推荐

  1. JAVA 开发中常用的工具有哪些?

    Java开发中常用的工具有以下几种: Eclipse:一款非常流行的开发工具,提供了很多方便的功能,如代码自动补全.调试.版本控制等. IntelliJ IDEA:一款功能强大的Java集成开发环境, ...

  2. 3DMAX基础建模 | 3Dmax修改器堆栈中的辅助工具

    今天给你解解闷,给你们聊一聊3Dmax修改器堆栈中的辅助工具怎么用? "锁定堆栈":当场景中有多个物体对象,如果我们对其中一个对象添加修改器,然后开启"锁定堆栈" ...

  3. Linux系统中使用linux-wifi-hotspot工具开启网络热点

    更好的干净纯洁阅读体检请访问个人网站:Linux系统中使用linux-wifi-hotspot工具开启热点. 本文描述如何在Linux系统中使用linux-wifi-hotspot工具开启网络热点. ...

  4. Linux开发5款实用工具推荐

    今天安利给大家5款实用的Linux开发工具,希望对大家工作效率的提升有所帮助. 容器 放眼于现实,现在已经是容器的时代了.容器既及其容易部署,又可以方便地构建开发环境.如果你针对的是特定的平台的开发, ...

  5. 嵌入式开发linux工具,嵌入式Linux开发入门之MfgTool工具的使用

    介绍嵌入式linux开发的环境搭建: 一.PC端环境搭建 2.Ubuntu装好后,在终端安装minicom工具,安装命令:sudo apt-get install minicom 注:该工具在后面烧录 ...

  6. linux服务端开发vs2012,Vs2012在Linux开发中的应用(1):开发环境

    在Linux的开发过程中使用过多个IDE.code::blocks.eclipse.source insight.还有嵌入式厂商提供的各种IDE.如VisualDsp等,感觉总是不如vs强大好用.尽管 ...

  7. 你必须知道的linux开发快捷键,熟知工具快速开发

    前言 节省时间就是提高效率,时间就是金钱,时间就是生命. 鲁迅名言:时间就是生命,无端地空耗别人的时间,其实是无异于谋财害命的.那如果你看到这篇文章不学习不点赞,无异于自杀. 你看了又不转发分享,无异 ...

  8. B/S开发中浏览器的工具利器

    B/S系统的前端浏览器性能和标准兼容方面是开发中的一个重要问题,把IE中使用的各种工具整理一下,对于开发中标准.规范检查等起到一个作用 主要是三个主流的浏览器和相关的插件 FireFox Firefo ...

  9. React开发中常用的工具集锦

    本文从属于笔者的React入门与最佳实践系列. 本文记录了笔者在React开发中常见的一些工具插件,如果你想寻找合适的项目生成器或者模板,请参考笔者的使用Facebook的create-react-a ...

最新文章

  1. OpenCV java 图片处理,蒙太奇图片(13)
  2. java exif_照片EXIF信息的读取和改写的JAVA实现
  3. mongo explain分析详解
  4. 圣诞日记2010-12-25:认清形势,看清方向,正确选择,努力拼搏(更新 )
  5. python opencv imread(filename, flags=None) 读取图像 flags cv::ImreadModes 参数上哪看去?
  6. QT的QHoverEvent类的使用
  7. numpy.loadtxt()用法
  8. Kubernetes 微服务监控体系
  9. 【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红
  10. python中时间的加n和减n运算
  11. Computex电脑展:AMD表现抢眼,融合将成市场主流
  12. openstack trove实例状态转换条件--Mitaka版本
  13. Fiori 磁贴配置
  14. 有人知道要怎么用c++提取出文本里面的信息吗,例如把这个表格里的所有住户账号,密码提取出来
  15. 相机PHP,C/C++、C#、PHP相机开发实例 大恒相机SDK
  16. 计算机二级易错知识点 2021 8.8
  17. 【整理】关于微信小程序--发布--学习
  18. 关于新浪微博iPhone客户端设计与实现硕士论文学习心得
  19. JavaScript发展历史(JS)
  20. 职业连连看模型,助你找到理想职业

热门文章

  1. (三)代表性物质点邻域的变形分析
  2. No.61-HackTheBox-windows-Conceal-Walkthrough渗透学习
  3. phps的利用(phps文件就是php的源代码文件)
  4. RS2323 RS485
  5. Hessian 矩阵(海塞矩阵)
  6. 《行为经济学》北京大学 孟涓涓 第五章
  7. 论文阅读:Attentive CutMix
  8. springboot+vue网上零食购物商城网站java
  9. 伦敦玛丽皇后学院计算机,【精选】伦敦大学玛丽皇后学院计算机科学本科.pdf...
  10. 【bug记录】RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasSgemm