
编译链接
文章平均质量分 88
helloworld的传说
文以拙成,道以拙见。
展开
-
link脚本组成
脚本中以MEMORY命令定义了存储空间,其中以ORIGIN定义地址空间的起始地址,LENGTH定义地址空间的长度。最简单的链接脚本只有一个命令:’SECTIONS ’。# 您可以使用 ’SECTIONS ’ 命令来描述输出文件的内存布局。’SECTIONS ’ 命令功能非常强大。在这里,我们将描述它的一个简单用法。假设您的程序仅包含代码,初始化数据和未初始化数据。它们分别位于“ .text ”,“.data ”和“ .bss ”段中。我们进一步假设这些是唯一将会出现在输入文件中的段。原创 2023-11-28 10:16:00 · 358 阅读 · 1 评论 -
.symtab ELF符号表(转载)
ELF文件中的“符号表(symbol table)”包含的是程序中的符号信息 – 这些符号代表的或许是定义(例如定义全局变量时使用的变量名,或者定义函数时使用的函数名),或许代表的是引用(例如使用关键字extern声明的变量或函数时使用的符号名称)。当代表的是定义时,在链接阶段链接器需要为它们重定位;当代表的是引用时,在链接阶段链接器需要在其他编译模块定位到该符号的定义。原创 2023-11-23 14:42:24 · 892 阅读 · 0 评论 -
Program Header Table(转载)
程序头表与段表相互独立,由ELF文件头统一管理。程序头表负责ELF文件从文件到加载后映像的映射关系,一般只有可执行文件包含。原创 2023-11-22 15:58:35 · 150 阅读 · 0 评论 -
section header
section header结构体的定义可以在 /usr/include/elf.h 中找到。下面我们依次讲解结构体各个字段:(1)sh_name,4字节,是一个索引值,在shstrtable(section header string table,包含section name的字符串表,也是一个section)中的索引。原创 2023-11-22 09:53:04 · 357 阅读 · 0 评论 -
link链接脚本介绍
在程序编译的时候,每个目标文件都是由源代码编译得到,最终多个目标文件链接生成一个可执行文件,而链接地址就是告知链接器,各个目标文件在可执行程序中的位置。链接脚本就是一个描述如何放置程序段的规则文件,链接器会根据这些规则,合理安排每个程序段的位置,将其链接成一个可执行程序。其中代码段(.text)、数据段(.data)、bss段(ZI段)这些段名是编译器链接器内部定好的。你没有提供自定义的链接脚本,则链接器将使用一个默认的链接脚本,可以使用“ld --verbose”命令来显示这个链接脚本的内容。原创 2023-11-22 14:13:43 · 213 阅读 · 0 评论 -
GNU工具链
工具链典型的例子就是GNU工具链。GNU工具链是由GNU项目产生的各种编程工具的集合,用于开发应用程序与操作系统。GNU工具链在针对嵌入式系统的Linux内核、BSD及其它软件的开发中起着至关重要的作用。GNU工具链中的部分工具也被Mac OS X, Microsoft Windows等其它平台进行了移植使用。GNU make:用于编译和构建的自动工具。GNU编译器集合(GCC):一组多种编程语言的编译器。GNU Binutils:包含链接器ld、汇编器as和其它工具的工具集。原创 2023-11-22 14:00:40 · 358 阅读 · 0 评论 -
ELF header
ELF header的定义可以在 /usr/include/elf.h 中找到。Elf32_Ehdr是32位 ELF header的结构体。Elf64_Ehdr是64位ELF header的结构体。所以,ELF header在ELF文件中的大小与位置是确定的,位置位于文件头部,大小则是Elf_Ehdr结构体的大小。/* Magic number和其它信息 */64位和32位只是个别字段长度不同,比如 Elf64_Addr 和 Elf64_Off 都是64位无符号整数。原创 2023-11-22 09:34:09 · 285 阅读 · 0 评论 -
目标文件(ELF格式)
ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由Section Header Table描述的一系列Section的集合,而执行一个ELF文件时,在加载器(Loader)看来它是由Program Header Table描述的一系列Segment的集合。**(1)可重定位目标文件(.o或者.a):**包含二进制代码和数据,其形式可以和其他目标文件进行合并,创建一个可执行目标文件。由上可知,.o、.a、.so均是ELF格式的,ELF文件是有结构的文件。原创 2023-11-21 18:27:46 · 203 阅读 · 0 评论 -
C编译流程
若#define x y 则将所有的x 以文本的层次 替换成y什么叫做以文本的层次:就是说这是无脑替换 不会检查语法错误 所以有时要注意运算顺序 加括号专业术语就是:将宏名替换为宏值。原创 2023-11-21 11:52:38 · 102 阅读 · 0 评论