gnu工具链的使用方法(ld、objcopy、objdump等工具)
创始人
2024-06-01 19:42:41
0

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

参考内容

(1)objcopy命令介绍_weixin_34236497的博客-CSDN博客

(2)GCC 各工具简介_bert_qing的博客-CSDN博客

(3)linux下反汇编命令_linux反汇编_烫手的热山药的博客-CSDN博客

(4)man手册

(5)目标文件格式分析工具: ar,nm,objdump,objcopy,readelf_51CTO博客_目标文件的格式

(6)objcopy命令_Linux objcopy命令使用详解:实现目标文件的格式转换

(7)binutils工具集 - 简书

前言 

在GCC编译器编译C/C++程序中提到,利用gcc命令并配合一些选项参数,可以实现分步编译。

gcc命令会根据这些选项参数,调用特定的工具来完成对应的步骤。

  • 添加选项-E表示预处理操作,则gcc会调用cpp这个预处理工具;
  • 添加选项-S表示编译,则gcc会调用ccl这个编译工具;
  • 添加选项-c选项表示汇编,则gcc会调用as这个汇编工具;
  • 如果gcc命令参数是.o形式的文件,则调用ld这个链接工具进行链接操作。

除了上面提到的工具,gnu工具链还包括其他工具,比如ar、gdb、nm、readelf、string、strip等工具,如下所示:

xjh@ubuntu:/usr/local/arm/arm-2009q3/bin$ ls arm-linux-*
arm-linux-addr2line  arm-linux-c++      arm-linux-g++        arm-linux-gcov    arm-linux-gprof  arm-linux-objcopy  arm-linux-readelf  arm-linux-strings
arm-linux-ar         arm-linux-c++filt  arm-linux-gcc        arm-linux-gdb     arm-linux-ld     arm-linux-objdump  arm-linux-size     arm-linux-strip
arm-linux-as         arm-linux-cpp      arm-linux-gcc-4.4.1  arm-linux-gdbtui  arm-linux-nm     arm-linux-ranlib   arm-linux-sprite
xjh@ubuntu:/usr/local/arm/arm-2009q3/bin$

我们也可以不通过gcc命令而直接调用这些工具,比如下面的Makefile文件。

all:test_adr.S#汇编:将汇编文件test_adr.S转换成目标文件test_adr.o@ arm-linux-gcc -c -o test_adr.o test_adr.S #链接:将目标文件的集合,组合成可执行程序test_adr.elf@ arm-linux-ld -Ttext 0x00000000 -g test_adr.o -o test_adr.elf#复制:将可执行程序test_adr.elf从一种二进制格式(elf)转换成另外一种格式(bin)@ arm-linux-objcopy -O binary -S test_adr.elf test_adr.bin #反汇编:将可执行文件test_adr.elf反汇编,并将结果输出到test_adr.dis文件(否则输出至终端)@ arm-linux-objdump -D -m arm test_adr.elf > test_adr.disclean:@ rm -f test_adr.dis test_adr.bin test_adr.elf *.o

那么这些工具的作用是什么?它们的选项参数表示什么含义?接下来将简单进行说明。

一、gcc工具

该工具的作用与用法见博客GCC编译器编译C/C++程序。

其实也可以在gcc命令后面直接添加其他工具的选项,gcc命令在调用其他工具时,会将这些选项传递给这些工具。 

二、objcopy工具

1、工具作用

objcopy主要用来转换目标文件的格式。在实际开发中,我们会用该工具进行格式转换内容删除

(1)在链接完成后,将elf格式的.out文件转化为bin格式的文件,因为有些平台不支持elf格式。

#复制:将可执行程序test_adr.elf从一种二进制格式(elf)转换成另外一种格式(bin)
arm-linux-objcopy -O binary -S test_adr.elf test_adr.bin 

(2)(通过-g、-S等选项来表示)删除文件正常运行时不需要的内容,比如符号表、重定位表、调试信息等。裁剪后其体积比原来小很多,可以节省flash资源。当flash空间不足时,我们可以先查看可执行文件中是否存在运行时非必需的内容,并利用objcopy工具删除。

arm-linux-objcopy -g -S -O elf32-littlearm test_adr.elf test_adr2.elf
#或者写成                         
arm-linux-objcopy -g -S test_adr.elf -O elf32-littlearm test_adr2.elf

2、选项含义

该工具使用格式如下。其中options表示选项,可以在命令行输入“man 1 objcopy”查看,这里摘录一些常用的选项。

objcopy [options] infile [outfile]   #[ ]表示可选(可写可无)

(1)[-O bfdname|--output-target=bfdname]

  • 表示输出文件的格式是bfdname。
  • bfdname是BFD库中描述的标准格式名,包括binary(表示二进制文件格式)、srec(表示S记录格式文件格式)、elf32-i386等。

(2)[-S|--strip-all]

  • 表示不要将源文件中的重定位信息和符号信息拷贝到输出文件中。

(3)[-F bfdname|--target=bfdname]

  • 表示源文件的格式是bfdname,同时也使用这个格式来写输出文件。

(4)[-R sectionpattern|--remove-section=sectionpattern]

  • 表示从输出文件中删除所有名为sectionpattern的段。
  • 这个选项可以多次使用,即可以“-R section1 -R section2”这样使用。
  • 注意,不恰当地使用这个选项可能会导致输出文件不可用。

(5)[-I bfdname|--input-target=bfdname]

  • 表示源文件的格式是bfdname。
  • 明确告诉objcopy源文件的格式,比“objcopy自己去分析源文件的格式”高效。

(6) [-g|--strip-debug]

  • 表示不要将源文件中的调试符号拷贝到输出文件中。

3、举例说明

[root@localhost test]# objcopy -O srec main main.srec    #将文件转换成S-record格式
[root@localhost test]# objcopy -O binary main main.bin    #将文件转换成rawbinary 格式
[root@localhost test]# objcopy -S main main.stripall    #生成一个不含重定位以及标号目标文件
[root@localhost test]# objcopy -R .comment main main.remove    #去掉指定名称的节
[root@localhost test]# objcopy --add-section mysection=hello_text main main.add      #添加一个自定义的节到可执行文件并将一个文件内容添加到其中
[root@localhost test]# objcopy -j mysection main.add section_hello     #将指定的段拷贝出来
[root@localhost test]# objcopy --only-keep-debug main.debug main.debuginfo     # 生成调试信息文件
[root@localhost test]# objcopy --strip-debug main.debug main.stripdebug    #生成 不含调试信息的可执行文件
[root@localhost test]# objcopy --add-gnu-debuglink=main.debuginfo main.stripdebug     #为不含调试信息的可执行文件添加调试信息

三、objdump工具

1、工具作用

objdump主要用来显示目标文件的内容或者反汇编。

比如本文开头的Makefile中有下面这一条代码:

#反汇编:将可执行文件test_adr.elf反汇编,并将结果输出到test_adr.dis文件(否则输出至终端)
@ arm-linux-objdump -D -m arm test_adr.elf > test_adr.dis

执行make之后生成的test_adr.dis文件内容如下: 

xjh@ubuntu:~/iot/tmp$ cat test_adr.dis test_adr.elf:     file format elf32-littlearmDisassembly of section .text:00000000 <_start>:0:	e59f0008 	ldr	r0, [pc, #8]	; 10 4:	e28f0004 	add	r0, pc, #48:	e59f0004 	ldr	r0, [pc, #4]	; 14 c:	e1a00000 	nop			; (mov r0, r0)00000010 :10:	e1a00000 	nop			; (mov r0, r0)14:	00000010 	andeq	r0, r0, r0, lsl r0Disassembly of section .ARM.attributes:00000000 <.ARM.attributes>:0:	00001a41 	andeq	r1, r0, r1, asr #204:	61656100 	cmnvs	r5, r0, lsl #28:	01006962 	tsteq	r0, r2, ror #18c:	00000010 	andeq	r0, r0, r0, lsl r010:	45543505 	ldrbmi	r3, [r4, #-1285]	; 0x50514:	08040600 	stmdaeq	r4, {r9, sl}18:	Address 0x00000018 is out of bounds.xjh@ubuntu:~/iot/tmp$ 

我们一般利用该工具对目标文件进行反汇编,以解决一些问题。比如,当我们利用addr2line也无法定位死机地址具体在哪行代码时,我们可以用objdump就程序进行反汇编,然后在反汇编文件中查找死机地址在哪个函数范围内,这样可以把问题缩小范围,一定程度上提高解决问题的效率。 

2、选项含义

该工具使用格式如下。其中options表示选项,可以在命令行输入“man 1 objdump”查看。

objdump [options] obj_file #[]表示可选,obj_file表示目标文件

(1)[-D|--disassemble-all]

  • 表示反汇编所有的段。

(2)[-m machine|--architecture=machine]

  • 指定反汇编目标文件时使用的架构。
  • 当待反汇编文件本身没有描述架构信息时,这个选项很有用。
  • 可以用-i选项列出这里能够指定的架构。

(3)[-S|--source]

  • 尽可能地反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。

(4)[-i|--info]

  • 显示对于 -b 或者 -m 选项可用的架构和目标格式列表。

(5)[-j section|--section=section]

  • 仅仅显示指定section的信息。

 (6)[-d|--disassemble]

  • 反汇编那些含有指令机器码的段。

3、举例说明

暂无。

四、LD工具

arm-linux-ld -Ttext 0X87800000 led.o -o led.elf

相关参数:

  • Tbss ADDRESS        bss段的链接地址;
  • Ttext ADDRESS     代码段链接地址;
  • Tdata ADDRESS     数据段链接地址;
  • -r --relocateable     产生可重定向的输出,比如,产生一个输出文件它可再次作为‘ld’的输入,这经常被叫做“部分链接”,当我们需要将几个小的.o文件链接成为一个.o文件的时候,需要使用此选项。
  • -e   指定程序的入口标号;
  • -l LibName   指定要链接的库;
  • -L Directory   增加库文件的搜索路径;
  • -o FILE   设置输出文件名;
  • -O   输出文件最优;

相关内容

热门资讯

求经典台词和经典旁白 求经典台词和经典旁白谁有霹雳布袋戏里的经典对白和经典旁白啊?朋友,你尝过失去的滋味吗? 很多人在即将...
小王子第二章主要内容概括 小王子第二章主要内容概括小王子第二章主要内容概括小王子第二章主要内容概括
爱情睡醒了第15集里刘小贝和项... 爱情睡醒了第15集里刘小贝和项天骐跳舞时唱的那首歌是什么谢谢开始找舞伴的时候是林俊杰的《背对背拥抱》...
世界是什么?世界是什么概念?可... 世界是什么?世界是什么概念?可以干什么?物质的和意识的 除了我们生活的地方 比方说山 河 公路 ...
全职猎人中小杰和奇牙拿一集被抓 全职猎人中小杰和奇牙拿一集被抓动画片是第五十九集,五十八集被发现,五十九被带回基地,六十逃走
“不周山”意思是什么 “不周山”意思是什么快快快快......一座山,神话里被共工撞倒了。
《揭秘》一元一分15张跑得快群... 一元一分麻将群加群主微【ab120590】【tj525555】 【mj120590】等风也等你。喜欢...
玩家必看手机正规红中麻将群@2... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
始作俑者15张跑的快群@24小... 微信一元麻将群群主微【ab120590】 【tj525555】【mj120590】一元一分群内结算,...
《重大通知》24小时一元红中麻... 加V【ab120590】【tj525555】【mj120590】红中癞子、跑得快,等等,加不上微信就...
盘点一下正规一块红中麻将群@2... 一元一分麻将群加群主微:微【ab120590】 【mj120590】【tj525555】喜欢手机上打...
(免押金)上下分一元一分麻将群... 微【ab120590】 【mj120590】【tj525555】专业麻将群三年房费全网最低,APP苹...
[解读]正规红中麻将跑的快@群... 微信一元麻将群群主微【ab120590】 【tj525555】【mj120590】一元一分群内结算,...
《普及一下》全天24小时红中... 微【ab120590】 【mj120590】【tj525555】专业麻将群三年房费全网最低,APP苹...
优酷视频一元一分正规红中麻将... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
《火爆》加入附近红中麻将群@(... 群主微【ab120590】 【mj120590】【tj525555】免带押进群,群内跑包包赔支持验证...
《字节跳动》哪里有一元一分红中... 1.进群方式-[ab120590]或者《mj120590》【tj525555】--QQ(QQ4434...
全网普及红中癞子麻将群@202... 好运连连,全网推荐:(ab120590)(mj120590)【tj525555】-Q号:(QQ443...
「独家解读」一元一分麻将群哪里... 1.进群方式《ab120590》或者《mj120590》《tj525555》--QQ(4434063...
通知24小时不熄火跑的快群@2... 1.进群方式《ab120590》或者《mj120590》《tj525555》--QQ(4434063...