
编译与链接
文章平均质量分 89
Liuqz2009
不念过去不畏将来,全心活在当下!
寒窗二十载,人生再出发!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Makefile语法介绍
command......target 也就是一个目标文件,可以是 Object File,也可以是执行文件。还可以是一个标签(Label),对于标签这种特性,在后续的“伪目标”章节中会有叙述。prerequisites 就是,要生成那个 target 所需要的文件或是目标。command 也就是 make 需要执行的命令。(任意的 Shell 命令)如果 Makefile 中出现一些相同命令序列,那么我们可以为这些相同的命令序列定义一个变量。定义这种命令序列的语法以“define”原创 2025-07-01 14:14:45 · 774 阅读 · 0 评论 -
官方 Linker Scripts 语法和规则解析(3)
当您将应用程序链接到具有版本化符号的共享库时,应用程序本身知道它需要每个符号的哪个版本,还知道它需要链接到的每个共享库中的哪个版本节点。另外,链接器接受后缀 ‘h’ 或 ‘H’ 表示十六进制,‘o’ 或 ‘O’ 表示八进制,‘b’ 或 ‘B’ 表示二进制,‘d’ 或 ‘D’ 表示十进制。例如,以下脚本片段演示如何将全局符号 ‘begin’ 设置为 ‘.text’ 段中的第一个位置,但如果名为 ‘begin’ 的符号已经存在,则其值将被保留。链接器不会为了把段更好的放入内存区域而打乱段的顺序。原创 2025-06-27 17:22:29 · 624 阅读 · 0 评论 -
官方 Linker Scripts 语法和规则解析(2)
在基于 DOS 的文件系统上,链接器会假定一个单字跟着一个冒号是一个特殊的驱动符,因此 ‘c:myfile.o’ 是一个文件的特殊使用,而不是关联库 ‘c’ 的 ‘myfile.o’ 文件。在只支持有限段数目的格式中,例如 a.out ,名称必须是该格式所支持的名称之一(例如 a.out ,只允许 ‘.text’,‘.data’,‘.bss’)。所有段的载入地址都被排布,使它们在内存中从整个 ‘OVERLAY’ 的载入地址开始都是连续的(就像普通的段定义,载入地址是可选的,缺省的就是开始地址;原创 2025-06-27 17:21:35 · 732 阅读 · 0 评论 -
官方 Linker Scripts 语法和规则解析(1)
符号可以是定义的也可以是未定义的。在插入前,因为 ‘-T’ 的脚本在默认脚本之前被解析,在 ‘-T’ 脚本中的声明会先于默认内部脚本的声明而执行。在此示例中, ‘.text’ 和 ‘.data’ 段的指定地址可以满足任何对齐方式约束,但链接器可能必须在 ‘.data’ 和 ‘.bss’ 段之间创建一个小的间隙。在特定的程序类型中,比如使用覆盖技术的嵌入式系统,当一个段被加载到内存中,另一个段不会被加载。因此,当您在源代码中使用链接器脚本定义的符号时,您应该始终获取该符号的地址,并且永远不要尝试使用它的值。原创 2025-06-27 17:19:41 · 858 阅读 · 0 评论 -
Linux 链接器 ld 的工作原理与应用实践
链接器是软件开发过程中的一个重要工具,它负责将编译器生成的多个目标文件和库文件合并成一个单一的可执行程序。在 Linux 系统中,ld 是常用的链接器,它执行的任务包括符号解析和重定位。符号解析是指链接器解决目标文件中引用的符号(如函数和变量)与定义这些符号的文件之间的映射关系。重定位则是指调整代码中的地址引用,使之适应最终加载到内存中的位置。通过这些操作,链接器确保程序中的各个部分能够正确地相互引用,并能够在运行时正确加载。在本节中,我们将简要介绍链接器的基本概念和 ld 链接器的主要功能。转载 2025-06-25 16:13:33 · 88 阅读 · 0 评论 -
深度探索Linux操作系统 —— Linux图形原理探讨
本质上,谈及图形原理必会涉及渲染和显示两部分。但是显示过程比较简单和直接,而渲染过程要复杂得多,更重要的是,渲染牵扯到操作系统内部的组件更多,因此,本章我们主要讨论渲染过程。我们不想只浮于理论,结合具体的GPU进行讨论更有助于深度理解计算机的图形原理。相比于 NV 及 ATI 的 GPU ,我们选择相对更开放一些的Intel的 GPU 进行讨论。Intel 的 GPU 也在不断的演进,本书写作时主要针对的是用在和Ivy Bridge架构上的。原创 2023-12-14 10:25:48 · 995 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建桌面环境
计算机领域中的桌面环境()其实是一种比喻的说法,即图形用户界面就像物理书桌一样,其上可以放置文件夹、文档等。桌面最初用来特指个人计算机(PC),但是现在不只个人计算机有图形界面环境,服务器、嵌入式设备等基本都提供桌面环境。桌面环境包括窗口管理器、任务条等基本组件,除了这些基本的组件外,有的桌面环境还提供文件管理器、控制面板等。桌面环境是操作系统中人机交互的关键部分,理解它的基本运作原理,无论是对理解操作系统,还是对开发应用程序,都有极大的帮助。原创 2023-12-13 09:05:47 · 908 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建根文件系统
在第 3 章中,我们通过手工的方式展示了从零构建根文件系统的过程。在本章中,我们将构建一个相对完善的根文件系统,但是我们不再从零开始,毕竟一旦熟悉了原理后,余下的就是简单的重复了。第 2 章编译工具链时曾通过参数 “” 指定了目标系统的文件安装的目录,后续所有的为目标系统编译的文件全部安装到了这个目录下。因此,在本章中,我们就基于这个目录下的文件构建运行在真实系统上的根文件系统。原创 2023-12-12 14:35:56 · 468 阅读 · 0 评论 -
深度探索Linux操作系统 —— 从内核空间到用户空间
因为某些文件系统的一些特性或者一些修复文件系统的操作,有可能导致文件系统中的文件所在的扇区发生改变。其他模块完全可以存储在文件系统上,通过文件系统的接口访问这些模块,避开了因为如修复文件系统而引起文件所在扇区的变化而带来的风险。为简单起见,我们只讨论典型的从硬盘加载操作系统的过程,所以后续的讨论全部是针对从硬盘启动的情况。嵌入到这个区域也不是必须的,但是因为这个相对安全的原因,GRUB 的开发人员推荐将 GRUB 嵌入到这个区域。在嵌入的映像中包含硬件及文件系统的驱动,因此,一旦嵌入的映像载入内存,原创 2023-12-10 17:33:42 · 426 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建initramfs
一般而言,桌面、服务器等通用系统都使用initramfs。部分嵌入式系统中,也会使用 initramfs,甚至有的使用 initramfs 作为最终的根文件系统。那么什么是 initramfs 呢?很难用一句话将 initramfs 的作用描述清楚,或许可以将initramfs定位为内核通往根文件系统的桥梁。原创 2023-12-08 09:53:52 · 1094 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建内核
内核的构建系统kbuild基于GNU Make,是一套非常复杂的系统。对于编译内核而言,一条make命令就足够了。因此,构建内核最困难的地方不是编译,而是编译前的配置。配置内核时,通常我们都能找到一些参考。比如,对于桌面系统,可以参考主流发行版的内核配置。但是,这些发行版为了能够在更多的机器上运行,几乎选择了全部的配置选项,编译了全部的驱动,不仅增加了内核的体积,还降低了内核的运行速度。再比如,对于嵌入式系统,BSP。原创 2023-12-07 11:49:46 · 481 阅读 · 0 评论 -
深度探索Linux操作系统 —— 构建工具链
《深度探索Linux系统:系统构建和原理解析》笔记——2.工具链构建 深度探索Linux操作系统 —— 编译过程分析深度探索Linux操作系统 —— 构建工具链 编译过程分为4个阶段,分别是:编译预处理、编译、汇编以及链接。每个阶段都涉及了若干工具,GNU将这些工具分别包含在3个软件包中:Binutils、GCC、Glibc。Binutils:GNU将凡是与二进制文件相关的工具,都包括在软件包Binutils中。Binutils就是 Binary utilities 的简写,其中主要包括生成目标文原创 2023-12-06 10:20:10 · 511 阅读 · 0 评论 -
深度探索Linux操作系统 —— 编译过程分析
在链接时,对于模块中引用的外部符号,链接器将根据符号表进行符号的重定位。如果我们将符号表删除了,那么链接器在链接时将找不到符号的定义,从而不能进行正确的符号解析。比如,代码中以 “.cfi” 开头的伪指令是辅助汇编器创建栈帧(stack frame)信息的。,而该函数体中也只有区区一行代码,但为什么产生的汇编代码如此之长?中的符号表删除,再次进行链接,则链接器将因找不到符号定义而终止链接,如下所示。的缩写,表示符号 foo2、foo2_func 是未定义的。来说是外部符号,没有在任何一个段中,所以在列。原创 2023-12-05 10:28:42 · 450 阅读 · 0 评论 -
Gcc 链接文件
【代码】GCC lds 文件。原创 2023-11-24 10:19:18 · 449 阅读 · 0 评论 -
Linux Section
【代码】section。原创 2023-11-23 18:27:53 · 298 阅读 · 0 评论 -
程序员的自我修养:链接、装载与库阅读
一、在线编码查看查看UTF-8,UTF-16编码汉字字符集编码查询参考字符编码方式对ELF显示的影响原创 2020-11-06 09:49:14 · 802 阅读 · 2 评论 -
ELF文件的动态链接器 原理 设计和代码
为了保持简洁,本文省去了对部分细节的描述,例如weak型变量,和GOT等重定位类型。本文假设读者了解ELF文件格式。代码在附件中。如果论坛不支持附件,可以发邮件给我要1 ELF文件的装载在ELF文件中,使用section和program两种结构描述文件的内容。通常来说,ELF可重定位文件采用section,ELF可执行文件使用program,可重链接文件则两种都用。装载转载 2015-02-03 13:51:54 · 770 阅读 · 0 评论 -
ELF可执行文件格式的理解
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统乃至内核驱动程序开发转载 2015-02-03 11:32:39 · 1147 阅读 · 0 评论 -
实例分析ELF文件静态链接
1.ELF文件格式概貌readelf -h查看elf文件头部信息可以看到Type值有三种:REL,EXEC,DYN。REL文件是只被编译没有被链接过的文件,其格式属于左边一种,elf header+section1,2,3...+section header table,每个section对应一个section header table entry,section he转载 2015-02-03 10:53:27 · 792 阅读 · 0 评论