文件中被引用但未定义的全局符号。这些符号在链接时需要从其他 object 文件或库中寻找对应的定义。3) 对于汇编源代码,还有可能是由汇编指令显式引用的外部符号。
`.symtab` 里的每个条目都包含了一些关键信息,如符号的名字、类型(变量、函数、数据段等)、大小、值(相对于文件或节的地址)、绑定(全局、局部或未定义)以及可见性(公共、私有或内部)。这些信息对于链接器进行符号解析和重定位至关重要。
接着是可执行OBJECT文件,它是由链接器将多个可重定位OBJECT文件和库文件合并后产生的。这类文件包含了可直接在ARM处理器上执行的机器代码,以及必要的元数据,如程序头表、节区头表等。可执行OBJECT文件的节区通常包括了`.text`(代码段)、`.data`(已初始化数据)、`.bss`(未初始化数据)和其他一些特殊用途的节区,比如`.got`(全局偏移量表)和`.plt`(过程链接表)。
至于共享OBJECT文件,它们类似于动态链接库,在运行时被加载到进程的地址空间。它们可以被多个进程同时使用,节省内存。共享OBJECT文件的结构与可执行OBJECT文件类似,但包含额外的信息,如动态链接器需要的符号表和重定位信息。
在ARM环境中,GNU ARM Linker(ld)负责将多个OBJECT文件组合成最终的可执行文件或共享对象。它处理重定位,解决符号引用,并根据需要创建运行时所需的辅助结构,如PLT和GOT,以支持动态链接。链接器还会处理节区的合并和优化,确保程序正确运行。
ARM-ELF文件格式还涉及到调试信息,这部分信息在`.debug`节区中,用于调试工具(如GDB)解析。它包含了源代码行号、变量和函数的映射关系,使得开发者可以在源代码级别上进行调试。
总结起来,ARM的ELF文件格式是嵌入式系统开发中重要的组成部分,它不仅包含了可执行的机器代码,还有重定位信息、调试信息以及各种节区定义,确保了代码能够在ARM处理器上正确运行。理解ELF文件格式对于理解程序的构建过程和调试是至关重要的。在开发过程中,GCC工具链(包括assembler、compiler和linker)会生成并处理这些ELF文件,为开发者提供了从源代码到可执行程序的完整流程。