【软件开发底层知识修炼】七 Binutils辅助工具之- ar工具与nm工具

学习交流加

  • 个人qq:
    1126137994
  • 个人微信:
    liu1126137994
  • 学习交流资源分享qq群:
    962535112

上一篇文章学习addr2line与strip工具。点击链接查看上一篇文章:点击查看

本篇文章学习两个工具:ar与nm工具。

文章目录

  • 1、ar工具
  • 2、nm工具
    • 2.1 代码案例分析
  • 3、总结

1、ar工具

ar工具很简单,用于将目标文件打包生成库或者将目标文件从库中解压出来

  • ar crs libname.a x.o y.o 将x.o y.o打包生成libname.a库
  • ar x libname.a 将libname.a库解压

2、nm工具

nm工具用于列出目标文件的符号的相关信息:地址,属性,名字等

使用nm工具,可以输出三部分内容:地址,段,标识符

如下图的例子;
在这里插入图片描述

其中标识符位于的段信息,需要说明一下。上述的T代表代码段。还有很多其他段标识符如下图:
在这里插入图片描述

它们具体的信可以参考《程序员的自我修养》,参考这本书后,可以更加详细的说明各个段标识代表什么意思。如下表:

A该符号的值是绝对的,在以后的链接过程中,不允许进行改变。这样的符号值,常常出现在中断向量表中,例如用符号来表示各个中断向量函数在中断向量表中的位置。
B该符号的值出现在非初始化数据段(.bss)中。例如,在一个文件中定义全局static int test。则该符号test的类型为b,位于bss section中。其值表示该符号在bss段中的偏移。一般而言,bss段分配于RAM中 。
C该符号为common。common symbol是未初始话数据段。该符号没有包含于一个普通section中。只有在链接过程中才进行分配。符号的值表示该符号需要的字节数。例如在一个c文件中,定义int test,并且该符号在别的地方会被引用,则该符号类型即为C。否则其类型为B。
D该符号位于初始化数据段中。一般来说,分配到.data section中。例如定义全局int baud_table[5] = {9600, 19200, 38400, 57600, 115200},则会分配于初始化数据段中。
G该符号也位于初始化数据段中。主要用于small object提高访问small data object的一种方式。
I该符号是对另一个符号的间接引用。
N该符号是一个debugging符号。
R该符号位于只读数据段。例如定义全局const int test[] = {123, 123};则test就是一个只读数据区的符号。注意在cygwin下如果使用gcc直接编译成MZ格式时,源文件中的test对应_test,并且其符号类型为D,即初始化数据段中。但是如果使用m6812-elf-gcc这样的交叉编译工具,源文件中的test对应目标文件的test,即没有添加下划线,并且其符号类型为R。一般而言,位于rodata section。值得注意的是,如果在一个函数中定义const char *test = “abc”, const char test_int = 3。使用nm都不会得到符号信息,但是字符串“abc”分配于只读存储器中,test在rodata section中,大小为4。
S符号位于非初始化数据段,用于small object。
T该符号位于代码段text section。
U该符号在当前文件中是未定义的,即该符号的定义在别的文件中。例如,当前文件调用另一个文件中定义的函数,在这个被调用的函数在当前就是未定义的;但是在定义它的文件中类型是T。但是对于全局变量来说,在定义它的文件中,其符号类型为C,在使用它的文件中,其类型为U。
V该符号是一个weak object。
WThe symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
-该符号是a.out格式文件中的stabs symbol。
?该符号类型没有定义。

2.1 代码案例分析

还是以上一篇文章的代码为例(代码是运行时错误的,但是这不影响我们的实验);

test.c

#include <stdio.h>int g_global = 0;
int g_test = 1;extern int* g_pointer;
extern void func();int main(int argc, char *argv[])
{printf("&g_global = %p\n", &g_global);printf("&g_test = %p\n", &g_test);printf("&g_pointer = %p\n", &g_pointer);printf("g_pointer = %p\n", g_pointer);printf("&func = %p\n", &func);printf("&main = %p\n", &main);func();return 0;
}

func.c

#include <stdio.h>int* g_pointer;void func()
{*g_pointer = (int)"D.T.Software";return;
}

对以上两个程序分别进行如下编译:

  • gcc -g -c func.c -o func.o
  • gcc -g -c test.c -o test.o

然后使用nm工具分别查看func.o与test.o
在这里插入图片描述

通过以上结果,可以看出

在func.o中:

  • func符号位于代码段,这显而易见
  • g_pointer符号是一个未定义存储段的符号。参考上表即可知道它的意思

在test.o中

  • func未定义,因为它本身是在func.c中定义的
  • g_global位于.bss段
  • g_pointer未定义
  • g_test位于数据段
  • main位于代码段
  • printf未定义,因为它是引自标准库中的代码

3、总结

学会使用ar工具与nm工具。了解nm输出对应的符号的说明信息,参考本文表格。

本文参考狄泰软件学院相关课程
想学习的可以加狄泰软件学院群,
群聊号码:199546072

学习探讨加个人(可以免费帮忙下载CSDN资源):
qq:1126137994
微信:liu1126137994

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具

上一篇文章学习了ar工具与nm工具&#xff0c;点击链接查看上一篇文章&#xff1a;点击链接 本片文章学习记录以下三个工具: objdumpsizestrings 1、objdump工具 用法&#xff1a; 反汇编目标文件&#xff0c;查看汇编到源码的映射&#xff08;后面代码案例分析看具体区别&a…

【C++深度剖析教程39】实现C++数组类模板

上一篇文章在那个学习了多参数类模板与特化的分析&#xff1a;点击链接查看上一篇文章&#xff1a;类模板深度剖析 本篇文章学习记录&#xff1a; 数值型模板参数实现C数组类模板 1、模板中的数值型参数 模板参数可以是数值型参数。也就是非类型参数。如下图所示&#xff1…

前端学习(168)全局事件属性

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/ TR/html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>事件</ti…

【原】两个时间相加的运算符重载实现

要求&#xff1a;两个时间相加&#xff0c;得到的时间形如“xx时&#xff1a;xx分&#xff1a;xx秒” -------------------------------------------------------------------------------------------------------------- 解答&#xff1a; 首先编写时间处理类 时间类 1 ///&l…

IOT变现

IOT&#xff08;物联网&#xff09;变现1. IOT 设备基础结构2.IOT 组成元素3.从M2M扩展到IOT的世界4. 工业4.0最近在看IOT变现&#xff0c;记录一下核心的知识点概念&#xff1a;IOT 是利用无线标签&#xff0c;传感器&#xff0c;MEMS(micro-ElectroMechanical System&#xf…

【C++深度剖析教程40】使用数值型模板技术计算1+2+3+...+N的值

上一篇文章学习了数值型模板技术&#xff0c;并利用相关技术&#xff0c;实现了C的数组类模板。点击文章查看上一篇文章&#xff1a;点击链接查看 本篇文章&#xff0c;继续利用模板技术来解决一个问题。 如果想求123…N的结果&#xff0c;有很多种方法。可以循环遍历&#x…

前端学习(169):无语义元素

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>无语义标签&…

dubbo思维导图

dubbo思维导图之前总结的 后续持续更新中

前端学习(170):无语义元素二

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>DIVCSS布局&…

【软件开发底层知识修炼】九 链接器-可重定位文件与可执行文件

上几篇文章学习了Binutils辅助工具里面的几个实用的工具&#xff0c;那些工具对于以后的学习都是非常有帮助的&#xff0c;尤其是C语、C语言的学习以及调试是非常有帮助的。点击链接查看上一篇文章&#xff1a;点击查看 本篇文章开始一个新的知识的学习&#xff0c;链接器的学习…

【软件开发底层知识修炼】十 链接器-main函数不是第一个被执行的函数

上一篇文章&#xff0c;大概了解了链接器的工作内容就是&#xff1a;符号解析和重定位。点击上一篇文章查看&#xff1a;点击查看。 本片文章其实还是围绕链接器来学习。只不过不是很明显&#xff0c;当你学到下一篇文章时&#xff0c;就明白了。 本篇文章来弄明白一个问题&a…

分享博文摘要图标【11/16更新】

经常写文章&#xff0c;希望给朴素的浏览界面添加一些生动的图标&#xff0c;让浏览者直接通过图片来得知这篇文章讲的是什么&#xff1f; &#xff08;效果预览...&#xff09; 博主特意搜集并上传了一些大家可能会用到的图标&#xff0c;提供16、32、48、64、128、甚至256像素…

【OS学习笔记】十二 现代处理器的结构和特点

本文是一个衔接点&#xff0c;上一篇文章以前都是学习8086实模式的知识。本文开始学习80386这种现代处理器的编程架构。由此进入保护模式的学习。点击链接查看上一篇文章&#xff1a;上一篇文章 1、现代处理器的结构和特点 1 流水线技术 处理器可以做很多事情&#xff0c;能…

前端学习(172):格式化文本

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>格式化</…

输出星号平行四边形

输出星号平行四边形 代码 #include <stdio.h>intmain(){inti, j, k, max; printf("Input max:"); scanf("%d", &max);for(i 1; i <max /21; i) /*1~max / 2 1 行 */{for(j max /2-i; j >0; j--) /*第i行的空白字符 */{ putchar(); }for(j…

投资理财分享

投资理财分享理财是作为工作之外的另一个技能&#xff0c;一直想去学习&#xff0c;但是由于种种原因&#xff0c;推迟&#xff0c;最近开始了自己理财课程&#xff0c;适合小白入手&#xff0c;持续更新中&#xff1b;

【OS学习笔记】十三 保护模式一:全局描述符表(GDT)

上一篇文章&#xff0c;我们大致领略了现代处理器的结构和特点。点解链接查看上一篇文章&#xff1a;现代处理器的结构和特点 本篇文章开始&#xff0c;学习保护模式下的的各种机制。什么是保护模式呢&#xff1f; 一般来说&#xff0c;操作系统负责整个计算机软硬件的的管理…

众多SEO专家集体盛赞

《SEO实战密码》将给你思路、眼界和方法的拓展之道。选一个适宜阅读的角落&#xff0c;一杯咖啡&#xff0c;一支笔&#xff0c;听Zac系统地讲SEO知识、见解和经验分享吧。我们都知道&#xff0c;你的竞争对手也会是Zac的粉丝。 葛小飞&#xff08;天真&#xff09;&#xff0c…

前端学习(173):格式化文本二

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>格式化</…

【OS学习笔记】十四 保护模式二:段描述符

上一篇文章初步进入保护模式的学习。首先学习了全局描述符表GDT。点击链接查看上一篇文章&#xff1a;全局描述符表 本篇文章继续学习&#xff0c;GDT中存放的条目&#xff1a;描述符&#xff0c;确切的说是段描述符。学习段描述符的作用以及段描述符的格式。 1、段描述符的格…