编译工具链介绍

参考:交叉编译工具链介绍_五里之南的博客-CSDN博客_交叉编译链是什么

GNU Binutils:

一般在解压后的交叉编译工具链bin目录下会有很多可执行程序工具

ld :GNU链接器。
as :GNU汇编器。
addr2line:将地址转换为文件名和行号。
ar:用于创建,修改和提取档案的实用程序。创建静态库
nm:列出目标文件中的符号。
objcopy:复制并转换目标文件。格式转换,比如把一个图片转成.o文件
objdump:显示目标文件中的信息。
readelf:显示来自任何ELF格式对象文件的信息。
size:列出的对象或归档文件的部分的尺寸。
strings:列出文件中的可打印字符串。
strip:丢弃的符号。

1、nm显示的地址是真实地址吗? 

nm -s  : 指为初始化的全局数据

nm -C -n : 由于是C++源文件,故添加-C 选项,为了方便查看,添加-n选项

B或b :未被初始化的全局数据,放在.bss段

为什么gdb显示的函数地址和nm不一样?_绛洞花主敏明的博客-CSDN博客 

怎么查看二进制文件内容?linux下nm命令告诉你! - 牧野星辰 - 博客园

不是,可能需要加偏移才能使真实地址

0000000000000000 B g_uninit
0000000000000000 D str
0000000000000000 T func1()
令人疑惑的是,为什么他们的地址都是0,难道说mcu的0地址同时可以存三种数据?其实不是这样的,按照上面的符号表规则,g_uninit属于.bss段,str属于全局数据区,而func1()属于代码段,这个地址其实是相对于不同数据区的起始地址,即g_uninit在.bss段中的地址是0,以此类推,而.bss段具体被映射到哪一段地址,这属于平台相关,并不能完全确定。

2、objdump

$objdump -d main.o: 反汇编程序
$objdump -t main.o : 显示符号表入

 3、readelf

ELF文件有三种类型:

可重定位的对象文件(Relocatable file)  .o文件

可执行的对象文件(Executable file)

可被共享的对象文件(Shared object file)

  • -h –file-header 文件头 Display the ELF file header

  • -S –section-headers 段头 Display the sections’ header

  • -s –syms 符号表 Display the symbol table

你可能感兴趣的:(C/C++,#,编译学习,编译)