![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编译原理
文章平均质量分 92
radixun
qwq
展开
-
【链接装载与库】 Linux共享库的组织
由于动态链接的诸多优点,大量的程序开始使用动态链接机制,导致系统里面存在数量 极为庞大的共享对象。如果没有很好的方法将这些共享对象组织起来,整个系统中的共享对象文件则会散落在各个目录下,给长期的维护、升级造成了很大的问题。所以操作系统一般会对共享对象的目录组织和使用方法有一定的规则,我们将在这一章介绍Linux 下共享库的管理问题。原创 2023-11-10 14:09:53 · 579 阅读 · 0 评论 -
【链接装载与库】动态链接(下)
动态链接的确有很多优势,比静态链接要灵活得多,但它是以牺牲一部分性能为代价的。主要原因是动态链接下对于全局和静态的数据访问都要进行复杂的GOT定位,然后间接寻址;对于模块间的调用也要先定位GOT, 然后再进行间接跳转,另外一个原因是动态链接的链接工作在运行时完成,即程序开始执行时,动态链接器都要进行一次链接工作。我们将在这一节介绍优化动态链接性能的一些方法。在动态链接下,程序模块之间包含了大量的函数引用,会耗费不少时间用于解决模块之间的函数引用的符号查找以及重定位。原创 2023-11-09 11:45:47 · 186 阅读 · 5 评论 -
【链接装载与库】动态链接(上)
静态链接使得不同的程序开发者和部门能够相对独立地开发和测试自己的程序模块,但静态链接的诸多缺点也逐步暴露出来,比如浪费内存和磁盘空间、模块更新困难等问题,使得人们不得不寻找一种更好的方式来组织程序的模块。静态连接的方式对于计算机内存和磁盘的空间浪费非常严重。特别是多进程操作系统情况下,静态链接极大地浪费了内存空间,想象一下每个程序内部除了都保留着printf()函数、 scanf()函数、strlen()等这样的公用库函数,还有数量相当可观的其他库函数及它们所需要的辅助数据结构。原创 2023-11-09 02:17:43 · 442 阅读 · 11 评论 -
【链接装载与库】可执行文件的装载与进程
Linux 系统是怎样装载ELF文件并且执行它的呢?bash 进程会调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执行指定的ELF文件,原先的bash进程继续返回等待刚才启动的 新进程结束,然后继续等待用户输入命令。在进入execve()系统调用之后,Linux内核就开始进行真正的装载工作。execve()系统调用相应的入口是sys_execve(), 它会进行一些参数的检查复制之后,调用do_execve()。原创 2023-11-05 14:50:12 · 148 阅读 · 11 评论 -
【链接装载与库】静态链接
当我们有两个目标文件时,如何将它们链接起来形 成一个可执行文件?这个过程中发生了什么?这基本上就是链接的核心内容:静态链接。我们将使用下面这两个源代码文件“a.c”和 “b.c”作为例子展开分析a.cb.c首先我们使用gcc将“a.c”和“b.c” 分别编译成目标文件“a.o”和 “b.o”原创 2023-10-12 00:41:00 · 53 阅读 · 0 评论 -
【链接装载与库】目标文件里有什么
了函数 “foo”,称目标文件B。原创 2023-10-10 00:43:56 · 91 阅读 · 1 评论 -
【链接装载与库】编译和链接
现在IDE一般都将编译和链接的过程一步完成,通常将这种编译和链接合并到一起的过程称为构建 (Build)。即使使用命令行来编译一个源代码文件,简单的一句“gcc hello.c”命令就包含了非常复杂的过程。事实上,上述过程可以分解为4个步骤,分别是预处理 (Prepressing)、 编译 (Compilation)、 汇编 (Assembly) 和链接 (Linking)原创 2023-10-02 01:49:58 · 73 阅读 · 1 评论 -
【链接装载与库】基础知识
计算机有各种硬件,但在软件开发者的角度看有三个最为关键:中央处理器(CPU),内存和I/O控制芯片早期的计算机没有很复杂的图形功能, CPU 的核心频率也不高,跟内存的频率一样,它们都是直接连接在同一个总线 (Bus) 上的。由于I/O 设备诸如显示设备、键盘、软盘和 磁盘等速度与 CPU 和内存相比还是慢很多,所以效率很缓慢为了协调CPU、 内存和高速的图 形设备,人们专门设计了一个高速的北桥芯片,以便它们之间能够高速地交换数据。原创 2023-10-02 00:49:52 · 36 阅读 · 1 评论