Linux环境下:程序的链接, 装载和库[可执行文件的装载]
现代操作系统如何装载可执行文件?
- 给进程分配独立的虚拟地址空间
- 建立虚拟地址空间和可执行文件的映射关系
- 把CPU指令寄存器设置成可执行文件的入口地址,启动执行
可执行文件在装载的过程中实际上是映射的虚拟地址空间,所以可执行文件通常被叫做映像文件(或者Image文件).
ELF文件的两种视角
- Section header table: 编译器、汇编器和链接器将这个文件看作是被区段(section)头部表描述的一系列逻辑区段的集合
- Program header table: 系统加载器将文件看成是由程序头部表描述的一系列段(segment)的集合。一个段(segment)通常会由多个区段(section)组成。例如,一个“可加载只读”段可以由可执行代码区段、只读数据区段和动态链接器需要的符号组成

readelf -a 可执行文件 可以看到section和segment的映射关系
readelf -a sta_loop

每个Segment包含的Section在下面的mapping种可以看到。图中Program Headers的Type的含义可以在 /usr/include/elf.h 中查看,Load即表示可装载的段

可以单独通过 readelf -l sta_loop查看可执行文件的程序头
-l --program-headers Display the program headers
ELF可执行文件和进程虚拟地址空间的映射关系
样例
#include <stdlib.h>
int main()
{
void* pm = NULL;
for(;;)
{
pm = malloc(100);
sleep(500);
if(pm)
{
free(pm);
}
}
}
编译成静态链接库 sta_loop
执行 ./sta_loop &
通过 proc 文件系统 /proc/<PID>/maps查看虚拟内存的映射情况, 该文件有6列, 各个列的含义
- 地址:虚拟内存区域的起始和终止地址
- 权限:虚拟内存的权限,r=读,w=写,x=执行,s=共享,p=私有
- 偏移量:虚拟内存区域在被映射文件中的偏移量
- 设备:映像文件的主设备号和次设备号
- 节点:映像文件的节点号
- 路径: 映像文件的路径

这里可以看到上面的两个段都对应到我们的静态链接库的elf文件,分别是只读+可执行的段以及可读可写的段。可以看到第二段的offset是映像文件中的偏移,000a6000和上面readelf -a sta_loop看到的偏移一致。
这个就是对应在操作系统中学到的,执行一个程序首先是要将可执行文件加载到可执行的代码段和数据段

具体linux内核是如何加载可执行程序并进行虚拟内存映射的可以查看这篇文章
https://blog.csdn.net/gatieme/article/details/51628257
Linux环境下:程序的链接, 装载和库[可执行文件的装载]的更多相关文章
- 如何查看Linux系统下程序运行时使用的库?
Linux系统下程序运行会实时的用到相关动态库,某些场景下,比如需要裁剪不必要的动态库时,就需要查看哪些动态库被用到了. 以运行VLC为例. VLC开始运行后,首先查看vlc的PID,比如这次查到的V ...
- 解决Linux系统下程序找不到动态库的方法
思路:一般来说,通过make命令已经将程序依赖的动态库编译出来了,通过make install命令已经将动态库安装到系统的某个路径下.找没找到动态库就看这个路径是否包含在系统默认搜索动态库的路径中,如 ...
- windows和linux环境下使用google的glog日志库
一.概述 glog是google推出的一款轻量级c++开源日志框架,源码在github上,目前最新release版本是v0.3.5. githut地址:https://github.com/googl ...
- Linux 环境下程序不间断运行
一.背景 在linux命令行中执行程序,程序通常会占用当前终端,如果不启动新的终端就没法执行其他操作.简单可以通过'&'将程序放到后台执行,但是这种方法有个问题就是,一旦连接远程服务器 ...
- C语言中Linux环境下编译与链接
编写一个简单的 hello.c 文件,以此为例. 1.编译并链接一个完全包含于一个源文件的C程序. gcc hello.c gcc -Wall hello.c gcc -o hello hello.c ...
- 编写第一个Linux环境下程序的编译,下载记录
跟着韦东山学习Linux: 今天系统系统性的学了代码的编译下载,条记录一下: 一,代码:001_led_on.S,就把下面代码编译后Bin文件下载进2440处理器. /* * 点亮LED1: gpf4 ...
- [Python学习] Linux环境下的Python配置,必备库的安装配置
1.默认Python安装情况 一般情况,Linux会预装Python的,版本较低,比如Ubuntu15的系统一般预装的是Python2.7.10. 使用命令:which python可以查看当前的py ...
- 【ARM-Linux开发】Linux环境下使用eclipse开发C++动态链接库程序
Linux环境下使用eclipse开发C++动态链接库程序 Linux中也有类似windows中DLL的变成方法,只不过名称不同而已.在Linux中,动态链接叫做Standard Object,生成的 ...
- Linux环境下部署完JDK后运行一个简单的Java程序
前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...
- 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案
基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...
随机推荐
- #贪心,构造#AT2266 [AGC008D] K-th K
题目 给你一个长度为 \(N\) 的整数序列 \(X\),请判断是否存在一个满足下列条件的整数序列 \(a\),如果存在,请构造一种方案 条件如下: \(a\) 的长度为 \(N^2\),并且满足数字 ...
- #网络流,树状数组#JZOJ 4020 Revolution with JZOJ 4018 Magic
CF297E Mystic Carvings=JZOJ 4018 Magic JZOJ 4020 Revolution 题目 有一个\(n*m(n,m\leq 20)\)的网格图 这格子有收益当且仅当 ...
- #SG函数,记忆化搜索#HDU 4111 Alice and Bob
题目 Alice和Bob两个好朋友又开始玩取石子了. 游戏开始时,有\(n\)堆石子排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个: ·从某堆石子中取走一个 ·合并任意 ...
- #主席树,离散,扫描线#洛谷 3168 [CQOI2015]任务查询系统
题目 分析 询问显然得预处理,考虑以优先级建权值线段树, 将优先级离散化处理,那么第\(k\)大可以用线段树来求 那任务怎么办,考虑时间用扫描线的方法,按照时间建新的线段树 把任务分成两部分,在两端差 ...
- OpenHarmony AI框架开发指导
一.概述 1.功能简介 AI 业务子系统是 OpenHarmony 提供原生的分布式 AI 能力的子系统.AI 业务子系统提供了统一的 AI 引擎框架,实现算法能力快速插件化集成. AI 引擎框架主要 ...
- python 虚拟环境篇
前言 这个倒是非常之重要. 首先我们知道python通过pip安装,那么我们安装的所有东西都会在我们pip下的配置目录下,这会显得非常臃肿,同样也让我们部署艰难. python虚拟环境,他是这样做的, ...
- 重走py 之路 ——列表(一)
前言 因为最近公司有python项目维护,所以把python的基础入门的书整理一遍,因为有些忘记了,同时在看<<python编程>>这本书的时候觉得对有基础的有很多的赘余,打算 ...
- Triton部署mmdeploy导出的TensorRT模型失败篇
记录一下历程,最终没有部署成功,应该是Ubantu系统版本的问题.现在没有时间搞了,先记录一下,后续用到再填坑. Triton demo git clone -b r22.06 https://git ...
- locust分布式压测的Step Load及no web模式下的报表自动生成
Running Locust in Step Load ModeIf you want to monitor your service performance with different user ...
- Flutter笔记-基础组件
图片和Icon 加载网络图片以及本地图片 Image( image: NetworkImage( "https://img-s-msn-com.akamaized.net/tenant/am ...