arm-linux编译


arm编译过程:
all:
	arm-linux-gcc -c -o led.o led.c
	arm-linux-gcc -c -o uart.o uart.c
	arm-linux-gcc -c -o init.o init.c
	arm-linux-gcc -c -o main.o main.c
	arm-linux-gcc -c -o start.o start.S
	arm-linux-ld -Ttext 0 start.o led.o uart.o init.o main.o -o uart.elf
	arm-linux-objcopy -O binary -S uart.elf uart.bin
	arm-linux-objdump -D uart.elf > uart.dis
clean:
	rm *.bin *.o *.elf *.dis
 
 
arm-linux-ld -Ttext 0 start.o led.o uart.o init.o main.o -o uart.elf
ld:
- The GNU linker
概述:
       ld [选项] objfile ...
 
 
  arm-linux-objcopy -O binary -S uart.elf uart.bin
objcopy:
-S
--strip-all (strip 剥去、剥)
不从源文件中拷贝重定位信息和符号信息到输出文件(目的文件)中去。
 
 
arm-linux-objdump -D uart.elf > uart.dis
dump:
-D 
--disassemble-all 
与 -d 类似,但反汇编所

 
 

一、objcopy把一种目标文件中的内容复制到另一种类型的目标文件中.   转载自:https://blog.csdn.net/liuchao1986105/article/details/6686518 (1)将图像编译到可执行文件内
Q: 如何将一个二进制文件,比如图片,词典一类的东西做为.o文件,直接链接到可执行文件内部呢?
A: $ objcopy -I binary -O elf32-i386 -B i386 14_95_13.jpg image.o $ gcc image.o tt.o -o tt $ nm tt | grep 14_95  或者objdump -ht image.o0805d6c7 D _binary_14_95_13_jpg_end 00014213 A _binary_14_95_13_jpg_size 080494b4 D _binary_14_95_13_jpg_start (2)使用objcopy把不用的信息去掉:
$ objcopy -R .comment -R .note halo halo.min (3) $ objcopy -R .note -R .comment -S -O binary xyb xyb.bin -R .note -R .comment 表示移掉 .note 与 .comment 段 -S 表示移出所有的标志及重定位信息 -O binary xyb xyb.bin 表示由xyb生成二进制文件xyb.bin
objcopy工具使用指南objcopy Utilityobjcopy [ -F bfdname | --target=bfdname ][ -I bfdname | --input-target=bfdname ][ -O bfdname | --output-target= bfdname ][ -S | --strip-all ] [ -g | --strip-debug ][ -K symbolname | --keep-symbol= symbolname ][ -N symbolname | --strip-symbol= symbolname ][ -L symbolname | --localize-symbol= symbolname ][ -W symbolname | --weaken-symbol= symbolname ][ -x | --discard-all ] [ -X | --discard-locals ][ -b byte | --byte= byte ][ -i interleave | --interleave= interleave ][ -R sectionname | --remove-section= sectionname ][ -p | --preserve-dates ] [ --debugging ][ --gap-fill= val ] [ --pad-to= address ][ --set-start= val ] [ --adjust-start= incr ][ --change-address= incr ][ --change-section-address= section{=,+,-} val ][ --change-warnings ] [ --no-change-warnings ][ --set-section-flags= section= flags ][ --add-section= sectionname= filename ][ --change-leading char ] [--remove-leading-char ][ --weaken ][ -v | --verbose ] [ -V | --version ] [ --help ]input-file [ outfile ]  
GNU实用工具程序objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中。Objcopy使用GNU BFD库去读或写目标文件。Objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式的目标文件转换成另一种格式的目标文件)。通过以上命令行选项可以控制Objcopy的具体操作。Objcopy在进行目标文件的转换时,将生成一个临时文件,转换完成后就将这个临时文件删掉。Objcopy使用BFD做转换工作。如果没有明确地格式要求,则Objcopy将访问所有在BFD库中已经描述了的并且它可以识别的格式,请参见《GNUpro Decelopment Tools》中“using ld”一章中“BFD库”部分和“BFD库中规范的目标文件格式”部分。通过使用srec作为输出目标(使用命令行选项-o srec),Objcopy可以产生S记录格式文件。通过使用binary作为输出目标(使用命令行选项-o binary),Objcopy可以产生原始的二进制文件。使用Objcopy产生一个原始的二进制文件,实质上是进行了一回输入目标文件内容的内存转储。所有的符号和重定位信息都将被丢弃。内存转储起始于输入目标文件中那些将要拷贝到输出目标文件去的部分的最小虚地址处。使用Objcopy生成S记录格式文件或者原始的二进制文件的过程中,-S选项和-R选项可能会比较有用。-S选项是用来删掉包含调试信息的部分,-R选项是用来删掉包含了二进制文件不需要的内容的那些部分。
input-fileoutfile参数input-file和outfile分别表示输入目标文件(源目标文件)和输出目标文件(目的目标文件)。如果在命令行中没有明确地指定outfile,那么Objcopy将创建一个临时文件来存放目标结果,然后使用input-file的名字来重命名这个临时文件(这时候,原来的input-file将被覆盖)。
-I bfdname --input-target=bfdname明确告诉Objcopy,源文件的格式是什么,bfdname是BFD库中描述的标准格式名。这样做要比“让Objcopy自己去分析源文件的格式,然后去和BFD中描述的各种格式比较,通过而得知源文件的目标格式名”的方法要高效得多。
-O bfdname --output-target= bfdname使用指定的格式来写输出文件(即目标文件),bfdname是BFD库中描述的标准格式名。
-F bfdname--target= bfdname明确告诉Objcopy,源文件的格式是什么,同时也使用这个格式来写输出文件(即目标文件),也就是说将源目标文件中的内容拷贝到目的目标文件的过程中,只进行拷贝不做格式转换,源目标文件是什么格式,目的目标文件就是什么格式。
-R sectionname--remove-section= sectionname从输出文件中删掉所有名为sectionname的段。这个选项可以多次使用。注意:不恰当地使用这个选项可能会导致输出文件不可用。
-S--strip-all (strip 剥去、剥)不从源文件中拷贝重定位信息和符号信息到输出文件(目的文件)中去。
-g--strip-debug不从源文件中拷贝调试符号到输出文件(目的文件)中去。
--strip-undeeded剥去所有在重定位处理时所不需要的符号。
-K symbolname--keep-symbol= symbolname仅从源文件中拷贝名为symbolname的符号。这个选项可以多次使用。
-N symbolname--strip-symbol= symbolname不从源文件中拷贝名为symbolname的符号。这个选项可以多次使用。它可以和其他的strip选项联合起来使用(除了-K symbolname | --keep-symbol= symbolname外)。
-L symbolname--localize-symbol= symbolname使名为symbolname的符号在文件内局部化,以便该符号在该文件外部是不可见的。这个选项可以多次使用。
-W symbolname-weaken-symbol= symbolname弱化名为symbolname的符号。这个选项可以多次使用。
-x--discard-all (discard 丢弃、抛弃)不从源文件中拷贝非全局符号。
-X--discard-locals不从源文件中拷贝又编译器生成的局部符号(这些符号通常是L或 . 开头的)。
-b byte--byte= byte Keep only every byte of the input file (header data is not affected). byte can bein the range from 0 to interleave-1, where interleave is given by the -i or--interleave option, or the default of 4. This option is useful for creating files toprogram ROM . It is typically used with an srec output target.
-i interleave--interleave= interleave (interleave 隔行、交叉)Only copy one out of every interleave bytes. Select which byte to copy with the-b or --byte option. The default is 4. objcopy ignores this option if you do notspecify either -b or --byte.
-p--preserve-dates (preserve 保存、保持)设置输出文件的访问和修改日期和输入文件相同。
[ --debugging ]如果可能的话,转换调试信息。因为只有特定的调试格式被支持,以及这个转换过程要耗费一定的时间,所以这个选项不是默认的。--gap-fill= val使用内容val填充段与段之间的空隙。通过增加段的大小,在地址较低的一段附加空间中填充内容val来完成这一选项的功能。
--pad-to= address填充输出文件到虚拟地址address。通过增加输出文件中最后一个段的大小,在输出文件中最后一段的末尾和address之间的这段附加空间中,用--gap-fill= val选项中指定的内容val来填充(默认内容是0,即没有使用--gap-fill= val选项的情况下)。
--set-start= val设置新文件(应该是输出文件吧?)的起始地址为val。不是所有的目标文件格式都支持设置起始地址。
--change-start = incr--adjust-start= incr通过增加值incr来改变起始地址。不是所有的目标文件格式都支持设置起始地址。
--change-addresses incr--adjust-vma incrChange the VMA and LMA addresses of all sections, section., as well as thestart address, by adding incr. Some object file formats do not permit sectionaddresses to be changed arbitrarily.
通过加上一个值incr,改变所有段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址),以及起始地址。某些目标文件格式不允许随便更改段的地址。
--change-section-address section{=,+,-} val--adjust-section-vma section{=,+,-} val设置或者改变名为section的段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址)。如果这个选项中使用的是“=”,那么名为section的段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址)将被设置成val;如果这个选项中使用的是“-”或者“+”,那么上述两个地址将被设置或者改变成这两个地址的当前值减去或加上val后的值。如果在输入文件中名为section的段不存在,那么Objcopy将发出一个警告,除非--no-change-warnings选项被使用。这里的段地址设置和改变都是输出文件中的段相对于输入文件中的段而言的。例如:(1)--change-section-address .text = 10000这里是指将输入文件(即源文件)中名为.text的段拷贝到输出文件中后,输出文件中的.text段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址)将都被设置成10000。(2)--change-section-address .text + 100这里是指将输入文件(即源文件)中名为.text的段拷贝到输出文件中后,输出文件中的.text段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址)将都被设置成以前输入文件中.text段的地址(当前地址)加上100后的值。
--change-section-lma section{=,+,-} val仅设置或者改变名为section的段的LMA(Load Memory Address装载地址)。一个段的LMA是程序被加载时,该段将被加载到的一段内存空间的首地址。通常LMA和VMA(Virtual Memory Address运行时地址)是相同的,但是在某些系统中,特别是在那些程序放在ROM的系统中,LMA和VMA是不相同的。如果这个选项中使用的是“=”,那么名为section的段的LMA(Load Memory Address装载地址)将被设置成val;如果这个选项中使用的是“-”或者“+”,那么LMA将被设置或者改变成这两个地址的当前值减去或加上val后的值。如果在输入文件中名为section的段不存在,那么Objcopy将发出一个警告,除非--no-change-warnings选项被使用。
--change-section-vma section{=,+,-} val仅设置或者改变名为section的段的VMA(Load Memory Address装载地址)。一个段的VMA是程序运行时,该段的定位地址。通常VMA和LMA(Virtual Memory Address运行时地址)是相同的,但是在某些系统中,特别是在那些程序放在ROM的系统中,LMA和VMA是不相同的。如果这个选项中使用的是“=”,那么名为section的段的LMA(Load Memory Address装载地址)将被设置成val;如果这个选项中使用的是“-”或者“+”,那么LMA将被设置或者改变成这两个地址的当前值减去或加上val后的值。如果在输入文件中名为section的段不存在,那么Objcopy将发出一个警告,除非--no-change-warnings选项被使用。
--change-warnings--adjust-warnings如果命令行中使用了--change-section-address section{=,+,-} val或者--adjust-section-vma section{=,+,-} val,又或者--change-section-lma section{=,+,-} val,又或者--change-section-vma section{=,+,-} val,并且输入文件中名为section的段不存在,则Objcopy发出警告。这是默认的选项。
--no-chagne-warnings--no-adjust-warnings如果命令行中使用了--change-section-address section{=,+,-} val或者--adjust-section-vma section{=,+,-} val,又或者--change-section-lma section{=,+,-} val,又或者--change-section-vma section{=,+,-} val,即使输入文件中名为section的段不存在, Objcopy也不会发出警告。
--set-section-flags section=flags为为section的段设置一个标识。这个flags变量的可以取逗号分隔的多个标识名字符串(这些标识名字符串是能够被Objcopy程序所识别的),合法的标识名有alloc,load,readonly,code,data和rom。You can set the contents flag for a section which does not havecontents, but it is not meaningful to clear the contents flag of a section which does have contents; just remove the section instead. Not all flags are meaningful for all object file formats.
--add-section sectionname=filename进行目标文件拷贝的过程中,在输出文件中增加一个名为sectionname的新段。这个新增加的段的内容从文件filename得到。这个新增加的段的大小就是这个文件filename的大小。只要输出文件的格式允许该文件的段可以有任意的段名(段名不是标准的,固定的),这个选项才能使用。
--change-leading-charSome object file formats use special characters at the start of symbols. The mostcommon such character is underscore, which compilers often add before everysymbol. This option tells objcopy to change the leading character of everysymbol when it converts between object file formats. If the object file formats usethe same leading character, this option has no effect. Otherwise, it will add acharacter, or remove a character, or change a character, as appropriate.
--remove-leading-charIf the first character of a global symbol is a special symbol leading character usedby the object file format, remove the character. The most common symbol leadingcharacter is underscore. This option will remove a leading underscore from allglobal symbols. This can be useful if you want to link together objects of differentfile formats with different conventions for symbol names.
--weakenChange all global symbols in the file to be weak. This can be useful when buildingan object that will be linked against other objects using the -R option to the linker.This option is only effective when using an object file format that supports weaksymbols.
-V--versionShow the version number of objcopy.
-v--verboseVerbose output: list all object files modified. In the case of archives, objcopy -Vlists all members of the archive.
--helpShow a summary of the options to objcopy.
二、objdump命令
摘自:http://man.linuxde.net/objdump

objdump   - display information from object files.

objdump命令是用查看目标文件或者可执行的目标文件的构成的gcc工具。

选项

--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. 

--prefix-addresses 
反汇编的时候,显示每一行的完整地址。这是一种比较老的反汇编格式。 

-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选项载入。

猜你喜欢

转载自blog.csdn.net/weixin_39420903/article/details/80342162