链接,加载,装载(一)

人生若只如初见:弄懂nginx与lua模块的交互。

以下内容是基于对可执行文件有着良好认识的前提下。

unix> ./p



p不是一个内置的命令,所以外壳会认为p是一个可执行目标文件,通过调用某个驻留在存储器中称为加载器(loader)的操作系统代码来运行它。

加载器将可执行目标文件中的代码和数据从磁盘拷贝到存储器中,然后跳转到程序的第一条指令或入口点(entry point)来运行该程序。

这个将程序拷贝到存储器并运行的过程叫做加载(loading).

存储器映像(a run-time memory image )



每个unix程序哦独有一个运行时存储器映像。

其中分为代码段、数据段、运行时堆。对于32位Linux系统,代码段总是从0x08048000开始,向上数据段是在接下来一个4KB对齐的地址。运行时堆则在接下来第一个4KB处,并通过malloc库往上增长。

用户栈总是从最大的合法用户地址开始。栈的上部开始的段是为操作系统驻留存储器的部分的代码和数据保留的。

根据可执行文件中段头部表,加载器将可执行文件的相关内容拷贝到代码和数据段。

加载器是如何工作的?


The new code and data segments are initialized to the contents of the executable file by mapping pages in the virtual address space to page-sized chunks of the executable file.

时间: 2025-01-04 07:51:48

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

链接,加载,装载(二)

编译驱动程序(compiler driver) 这代表用户在需要时调用语言预处理器.编译器.汇编器和链接器. 预处理器  cpp c编译器 cc1 汇编器 as 链接器 ld 值得留意得是驱动程序经过相同的程序生成xxx.o,最后,它运行链接器程序ld,将main.o文件和xxx.o以及一些必要的系统目标文件组合起来,创建一个可执行目标文件. 像unix ld这样的静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件

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_

编译 链接 加载

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

hibernate学习(6)——加载策略(优化)

1. 检索方式 1  立即检索:立即查询,在执行查询语句时,立即查询所有的数据. 2 延迟检索:延迟查询,在执行查询语句之后,在需要时在查询.(懒加载) 2.  检查策略 1  类级别检索:当前的类的属性获取是否需要延迟. 2  关联级别的检索:当前类 关联 另一个类是否需要延迟. 3.类级别检索 1  get:立即检索.get方法一执行,立即查询所有字段的数据. 2 load:延迟检索.默认情况,load方法执行后,如果只使用OID的值不进行查询,如果要使用其他属性值将查询 . Custome

android 网络加载图片

通过网络链接加载网络图片 加权限,允许访问网络 <uses-permission android:name="android.permission.INTERNET"/> MainActivity package com.chuanxidemo.shaoxin.demo08; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; imp

emlog通过pjax实现无刷新加载网页--完美解决cnzz统计和javascript失效问题

想要更详细了解pjax,需要查看官网 或者看本站文章:jQuery.pjax.js:使用AJAX和pushState无刷新加载网页(官网教程中文翻译) 效果看本站,音乐无刷新播放,代码高亮和复制js加载成功- 准备文件 编辑模板 header.php 的 head 添加必要文件: jquery-1.11.1.min.js:百度网盘下载 jquery.pjax-1.8.2.min.js:百度网盘下载 下载到模板的 scripts 目录下后将下面两句添加到</head>所有script标签的最前面

Django中App的teemplates加载顺序

背景 ??Python版本:3.7 ??Django版本:1.8 做了一个简略的备忘概述,推荐阅读参考链接. 加载顺序 在Django中,App首先访问的templates是在setting中设置的DIRS. 如果DIRS文件夹中找不到模板的话,那么就会去App中去查找模板(不用自己设置是默认的). 但是如果在app的views中设置如下(指定文件夹),那么去查找的就是一个在settings中设置的DIRS文件夹下的test.html,如若找不到,会直接报错.而不会再去APP中去寻找test.h

Java类的加载、链接和初始化

一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样Java就可以对该对象进行一系列操作,装载过程有两个比较重要的特征:层次组织结构和代理模式.层次组织结构指的是每个类加载器都有一个父类加载器,通过getParent()方法可以获取到.类加载器通过这种父亲-后代的方式组织在一起,形成树状层次结构.代理模式则指的是一个类加载器既可以自己完成Java类的