链接,加载,装载(二)

编译驱动程序(compiler driver)



这代表用户在需要时调用语言预处理器、编译器、汇编器和链接器。

预处理器  cpp

c编译器 cc1

汇编器 as

链接器 ld

值得留意得是驱动程序经过相同的程序生成xxx.o,最后,它运行链接器程序ld,将main.o文件和xxx.o以及一些必要的系统目标文件组合起来,创建一个可执行目标文件。

像unix ld这样的静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成。指令在一个节中,初始化的全局变量在另一个节中,而未初始化的变量在另外一个节中。

unix> ./p

再次铺垫下,外壳调用操作系统中一个叫做加载器的函数,它拷贝可执行文件p中的代码和数据到存储器,然后将控制转移到这个程序的开头。

目标文件纯属字节块的组合。在这些块中,有些包含程序代码,有些则包含程序数据,而其他的则包含指导链接器和加载器的数据结构。链接器将这些块连接起来,确定被连接块的运行时位置, 并且修改代码和数据块中的各种位置。

目标文件


  1. 可重定位目标文件
  2. 可执行目标文件
  3. 共享目标文件

编译器和汇编器生成可重定位的目标文件(包括共享目标文件)。

链接器生成可执行目标文件。

目标文件的格式:

System V Unix  (COFF)Common Object File Format
Windows NT (PE)Portable Executable
Unix(如Linux, System V Unix后来的版本,各种 BSD Unix等) (ELF)Executable and Linkable Format

以下是一个ELF格式的可重定位目标文件:

以下两个主题暂时跳过。

  • 符号和符号表
  • 符号解析

与静态库链接



在Unix系统中,静态库以一种称为存档(archive)的特殊文件格式存放在磁盘中。

存档文件是由一组连接起来的可重定位目标文件组合,有一个头部用来描述每个成员目标文件的大小和位置。

存档文件名由后缀.a标识。

to be continued ...

时间: 2024-10-13 14:40:57

链接,加载,装载(二)的相关文章

链接,加载,装载(一)

人生若只如初见:弄懂nginx与lua模块的交互. 以下内容是基于对可执行文件有着良好认识的前提下. unix> ./p p不是一个内置的命令,所以外壳会认为p是一个可执行目标文件,通过调用某个驻留在存储器中称为加载器(loader)的操作系统代码来运行它. 加载器将可执行目标文件中的代码和数据从磁盘拷贝到存储器中,然后跳转到程序的第一条指令或入口点(entry point)来运行该程序. 这个将程序拷贝到存储器并运行的过程叫做加载(loading). 存储器映像(a run-time memo

AutoSharedLibrary -- 基于模板元编程技术的跨平台C++动态链接加载库

基于模板元编程技术的跨平台C++动态链接加载库.通过模板技术,使用者仅需通过简单的宏,即可使编译器在编译期自动生成加载动态链接库导出符号的代码,无任何额外的运行时开销. ASL_LIBRARY_BEGIN(TestLib) ASL_SYMBOL(Proc_test1, test1, false) ASL_SYMBOL(Proc_test2, test2, true) ASL_LIBRARY_END() TestLib theLib; try { theLib.Load("./1.so"

链接加载文件gcc __attribute__ section

在阅读源代码的过程中,发现一个头文件有引用: /** The address of the first device table entry. */ extern device_t devices[]; /** The address after the last device table entry. */ extern device_t devices_end[]; /** The address of the first "driver_t". */ extern driver_

spring源码阅读之Bean的加载(二)

在正式分析源码之前,先来了解一下SpringBeans里面最核心的两个类  DefaultListableBeanFactory XMLBean继承自 DefaultListableBeanFactory,而 DefaultListableBeanFactory是整个Bean加载的核心部分,是Sprin注册及加载Bean的默认实现,而对于XmlBeanFactory与 DefaultListableBeanFactory不同的地方其实就是在XmlBeanFactory中使用了自定义的XML读取器

编译 链接 加载

本篇文章是组内分享的小结,主要介绍源代码 -> 可执行程序 -> 执行这一过程.也就是源代码是如何转化为可执行程序,然后可执行程序又是如何执行的.在用java或python时,只需要java ClsName或者python a.py就可以执行相应的程序,实际上它们都是依托于底层的虚拟机.本文主要介绍的是操作系统级别的连接.加载.执行等,而不是虚拟机语言的执行.这里只对链接.加载进行一个简介,详细内容推荐大家去看<深入理解计算机系统>和<程序员的自我修养>,第二本要比第一

Python学习-4.Python的模块加载(二)

1.部分函数加载 1 from SameFolder import printSameFolder 2 printSameFolder() 该代码指从SameFolder.py中加载printSameFolder这个函数,而不加载SameFolder.py的其他函数. 第二行即调用该函数. 2.加载为别名 1 import SameFolder as ShortCall 2 ShortCall.printSameFolder() 则ShortCall就指代SameFolder,这在import长

关于flume配置加载(二)

为什么翻flume的代码,一方面是确实遇到了问题,另一方面是想翻一下flume的源码,看看有什么收获,现在收获还谈不上,因为要继续总结.不够已经够解决问题了,而且确实有好的代码,后续会继续慢慢分享,这里先把启动的流程分析一下,这也是找到问题症结的关键. 至于遇到的问题如下: Caused by: org.apache.flume.ChannelException: Put queue for MemoryTransaction of capacity 100 full, consider com

学习andriod开发之 异步加载图片(二)--- 使用其他进度条

大家好 我是akira上一节 我们讲到使用AsyncTask 这个类进行异步的下载 主要是涉及到一些图片的更新 这次我们继续上一个demo的改进 . 不知道你是否发现一个问题 上一节我们遗留了两个bug 1 在无网络情况下 点击会崩 咱们说 软件开发最忌讳的就是crash 而这个是在bug解决方案中的一级要解决的 所以这个问题 必须搞定 2 就是我们会发现进度并未更新 而图片是显示完毕了的 3 就是一个扩展 这次我将会带来 daimajia的新库 也是做库小达人的最新作品 NumberProgr

图片高效加载(二) 图片的异步加载

图片的异步加载是利用AsynTask类对图像进行后台加载完成后再给ImageView,先转载一篇前人的较好的总结后面再添加一些自己的见解和贴上完整的实现demo. 前面的转自:https://my.oschina.net/rengwuxian/blog/183802 摘要: 有没有过这种体验:你在Android手机上打开了一个带有含图片的ListView的页面,用手猛地一划,就见那ListView嘎嘎地卡,仿佛每一个新的Item都是顶着阻力蹦出来的一样?看完这篇文章,你将学会怎样避免这种情况的发