然后我们把俩文件都编译为.o文件
.o文件是二进制,需要用readelf工具查看
我们首先看main.o
.o文件是没有入口地址的,也没有program headers,这是由连接器给出的
.strtab
.strtab
是 ELF 文件中的一个特殊节(section),用于存储字符串表(string table)。在 ELF 文件中,很多地方都会引用字符串,比如节的名称、符号的名称等等,这些字符串都被存储在 .strtab
节中。.strtab
节中的每个字符串都以null结尾。
.text
代码段,这里面还有需要重定位的信息。
.rela.text
.rela.text
是一个重定位表(Relocation Table),它包含了对于.text
节中的代码的重定位信息。重定位表(Relocation Table)用于告诉链接器或加载器在程序运行或加载时如何修改代码段(如.text
节)中的地址,以便正确地引用其他部分的数据或代码。在.rela.text
中,记录了需要进行重定位的位置和需要进行的重定位操作,例如修改代码中的某个地址,使其指向正确的数据或函数。
一般情况下,.rela.text
会包含.text
节中对其他符号(如全局变量、函数等)的引用信息,以确保程序在运行时能够正确地找到这些符号的地址。
.sdata
.sdata
节用于存储小数据(Small Data),这类数据通常指的是全局变量和静态变量,其大小足够小,可以通过立即数寻址的方式来访问。这样可以提高程序的运行效率,因为直接访问小数据区的全局变量速度比从一般的数据段(如.data
节)中访问要快。.sdata
节特别适用于那些对性能要求较高的应用程序或嵌入式系统中。
.comment
.comment
节(section .comment
)是 ELF 文件中的一种特殊节,用于存储注释信息。这些注释通常是由开发人员或编译工具在编译过程中添加的,用于调试目的或提供有关文件内代码或数据的附加上下文信息。
.riscv.attributes
.riscv.attributes
是 RISC-V 架构的 ELF 文件中的一个特殊节,用于存储与 RISC-V 架构相关的特定属性信息。这些属性通常由编译器或工具添加,用于描述与 RISC-V 架构相关的特定信息,例如代码生成选项、特定指令集的使用等。这些信息在编译和链接过程中可能会被使用,以确保生成的可执行文件或库与目标架构兼容并具有正确的行为。
.eh_frame
.eh_frame
节是 ELF 文件中的一种特殊节,用于存储异常处理框架信息。这些信息通常由编译器生成,用于支持程序在运行时进行异常处理、栈回溯和调试。.eh_frame
节包含了一系列的数据结构,如 CIE (Common Information Entry) 和 FDE (Frame Description Entry),它们描述了程序执行时栈帧的结构和异常处理的相关信息。
.rela.eh_frame
.llvm_addrsig
.llvm_addrsig
不是 ELF 文件中的标准节,而是 LLVM 编译器引入的一个特殊节。它包含了一些用于调试和性能分析的地址签名信息,有助于工具在处理二进制文件时更好地理解程序的结构和执行流程。
.symtab
.symtab
节是 ELF 文件中的符号表节,用于存储程序的全局符号信息。这些符号包括函数名、变量名以及其他标识符。.symtab
节中的条目提供了符号的名称、类型、绑定信息以及符号在文件中的地址或者与之关联的节的索引等信息。通常用于调试、动态链接和符号解析等操作。
add.o类似,然后我们看一下他的符号表