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 对程序进行动态调 ...
随机推荐
- 【放假第1天】采购季倒计时 2G 50/年,4G 618/3年 云服务器选购攻略 阿里云 腾讯云 京东云对比 搭建网站、数据分析
更新日期:4月4日(阿里云价格回调,京东云采购季持续进行) <最新对比表>已更新在文章头部-腾讯云文档,文章具有时效性,请以腾讯文档为准! https://docs.qq.com/do ...
- #分治 or 线段树+单调栈#CF526F Pudding Monsters
题目 给定一个 \(n \times n\) 的棋盘,其中有 \(n\) 个棋子,每行每列恰好有一个棋子. 求有多少个 \(k \times k\) 的子棋盘中恰好有 \(k\) 个棋子. 分析 先将 ...
- java中的类型擦除type erasure
目录 简介 举个例子 原因 解决办法 总结 简介 泛型是java从JDK 5开始引入的新特性,泛型的引入可以让我们在代码编译的时候就强制检查传入的类型,从而提升了程序的健壮度. 泛型可以用在类和接口上 ...
- std::thread 五:打包任务(packaged_task)
#include <iostream> #include <thread> #include <mutex> #include <list> #incl ...
- win7电脑IE浏览器开发人员工具中不能切换浏览器版本
win7电脑 IE浏览器 开发人员工具,不能切换IE版本 这个是IE浏览器的问题,需要安装个微软件东西就可以解决这个问题了.亲测有效 64位下载地址:https://wwi.lanzoui.com/i ...
- Godot.NET C#IOC重构(2):TileMap 详解
目录 前言 TileMap添加 TileMap绘制 TileMap 连续图块 修改纹理原点 统一设置 自动地形 匹配规则 修改匹配概率 修改概率前 修改概率后 随机图块 Scattering 不连续间 ...
- GAN的一些问题
GAN为什么难以训练? 大多深度模型的训练都使用优化算法寻找损失函数比较低的值.优化算法通常是个可靠的"下山"过程.生成对抗神经网络要求双方在博弈的过程中达到势均力敌(均衡).每个 ...
- 密码学中的RSA算法与椭圆曲线算法
PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. 在数字安全领域,加密算法扮演着至关重要的角色.它们确保了信息的机 ...
- Signalr断线重连机制
前言 Signalr 即时消息发布到服务器后发现链接老是自动断开,导致无法发送广播后面百度搜了一下,signalr有个超时的机制 解决办法(js) //链接到自己的hub var connection ...
- MAC Book: Operation not permitted
背景: 最近清理系统上的一些无用的文件后,为了release出可用空间,所以还要把.Trash目录下的文件清理才真正清理完,但是ls 查看该目录时发现一直报"operation not pe ...