linux 可执行文件启动流程

article/2025/1/13 13:07:53

linux ELF文件启动流程

一、背景

​ 最近看了《linkers and loader》和以前学习《程序员的自我修养》,但是看了理解不是特别透,所以就想通过一个实际的案例来把了解到知识串起来,因此就想到把linux 识别和启动elf可执行文件流程梳理下,巩固自己所学。

二、内容

2.1 基础知识

​ 无论是通过shell还是通过system函数的方式去调用新的命令,他底层的调用接口都是通过linux函数族实现的,linux主要的函数如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

整个代码执行伪代码如下:

int pid = fork();
if(pid == 0) {//children processexecv();
} else {//parent processwaitpid(pid);
}

而exec这一系列函数的主要功能就是识别不同文件类型,并用使用对应的文件解析器解析和加载文件到当前进程的虚拟地址空间,然后将程序控制权转移给对应文件给定的入口地址,有入口地址内的程序完成自我的初始化后,执行程序对应功能。

2.2 elf 执行文件详细启动流程讲解

​ 下面将通过一个简单的测试demo,对elf 文件的启动进行详细分析:

​ 测试代码如下:

#include <stdio.h>int main() {printf("just for the test\n");return 0;
}
# test elf header
ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF64Data:                              2's complement, little endianVersion:                           1 (current)OS/ABI:                            UNIX - System VABI Version:                       0Type:                              EXEC (Executable file)Machine:                           Advanced Micro Devices X86-64Version:                           0x1Entry point address:               0x400430Start of program headers:          64 (bytes into file)Start of section headers:          6528 (bytes into file)Flags:                             0x0Size of this header:               64 (bytes)Size of program headers:           56 (bytes)Number of program headers:         9Size of section headers:           64 (bytes)Number of section headers:         31Section header string table index: 30

1. 内核执行部分

应用层execl函数族的调用最终会调用到内核的sys_execve函数,对应的执行代码如下:

//fs/exec.c 文件
SYSCALL_DEFINE3(execve,const char __user *, filename,const char __user *const __user *, argv,const char __user *const __user *, envp)
{return do_execve(getname(filename), argv, envp);
}

在do_execve中将进程的参数准备好后,通过查询的方式调用load_binary 加载对应进程,函数大体流程如下:

static int do_execve(struct filename *filename,const char __user *const __user *__argv,const char __user *const __user *__envp) {/* 1.prepare function environment, argc, argv2. call search_binary_handler() load binary*/static int search_binary_handler(struct linux_binprm *bprm){list_for_each_entry(fmt, &formats, lh) {if (!try_module_get(fmt->module))continue;read_unlock(&binfmt_lock);retval = fmt->load_binary(bprm);read_lock(&binfmt_lock);put_binfmt(fmt);if (bprm->point_of_no_return || (retval != -ENOEXEC)) {read_unlock(&binfmt_lock);return retval;}}}
}

// elf 文件的load_binary函数如下:

//fs/binfmt_elf.c
static int load_elf_binary(struct linux_binprm *bprm)
{/*1. check is elf format file2. load elf file program header3. load interpreter into memory4. start_thread begin address is interpreter entry address*/START_THREAD(elf_ex, regs, elf_entry, bprm->p);
}

2. 应用层执行部分

通过内核解析和加载后,并启动新的进程相应的入口函数时interpreter(链接器)的入口函数,相应的执行代码流程如下:
//sysdeps/x86_64/dl-machine.h
//入口函数
_start:movq %rsp, %rdicall _dl_start//elf/rtld.c
static ElfW(Addr) __attribute_used__
_dl_start (void *arg)
{/*1. relocation ld library self(ld library always static link don't have dynamic link),this alway do nothing2. set up runtime setup,(set global off set table dl_runtime value)3. load library dependencies, and return elf execute entry*/elf_machine_runtime_setup();_dl_start_final()
}//after dl_start return back,next call is dl_start_user
/*
1. backtrace stack to the argc argc env
2. call preinitial funcitons
3. jump to the execute file entry start execute
*/
_dl_start_user:\n\# Save the user entry point address in %r12.\n\movq %rax, %r12\n\# See if we were run as a command with the executable file\n\# name as an extra leading argument.\n\movl _dl_skip_args(%rip), %eax\n\# Pop the original argument count.\n\popq %rdx\n# Adjust the stack pointer to skip _dl_skip_args words.\n\leaq (%rsp,%rax,8), %rsp\n\# Subtract _dl_skip_args from argc.\n\subl %eax, %edx\n\# Push argc back on the stack.\n\pushq %rdx\n\# Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\# argc -> rsi\n\movq %rdx, %rsi\n\# Save %rsp value in %r13.\n\movq %rsp, %r13\n\# And align stack for the _dl_init call. \n\andq $-16, %rsp\n\# _dl_loaded -> rdi\n\movq _rtld_local(%rip), %rdi\n\# env -> rcx\n\leaq 16(%r13,%rdx,8), %rcx\n\# argv -> rdx\n\leaq 8(%r13), %rdx\n\# Clear %rbp to mark outermost frame obviously even for constructors.\n\xorl %ebp, %ebp\n\# Call the function to run the initializers.\n\call _dl_init\n\# Pass our finalizer function to the user in %rdx, as per ELF ABI.\n\leaq _dl_fini(%rip), %rdx\n\# And make sure %rsp points to argc stored on the stack.\n\movq %r13, %rsp\n\# Jump to the user's entry point.\n\jmp *%r12\n\

3. execute file 执行流程

​ execute file函数执行流程网上比较多,所以不在本次分析的重点中,如果有需要查看请跳转链接

三、 附录

  1. linux elf 启动流程

http://chatgpt.dhexx.cn/article/jwTl5mHp.shtml

相关文章

Linux可执行文件制作

Linux可执行文件制作 背景 测试过程中&#xff0c;需要针对不同的Linux系统、核心服务版本进行验证&#xff0c;各种环境依赖的python版本以及已安装的库存在较大差异&#xff0c;考虑到实际测试需求以及出差现场使用的要求&#xff0c;需要将测试脚本打包为可执行文件&#xf…

如何将Python程序打包成linux可执行文件

如何将Python程序打包成linux可执行文件 方法1.安装环境2.打包程序3.执行文件 方法 前段时间尝试使用Python的tkinter制作了一个简单的丑丑的图形化界面&#xff0c;现在想把它打包成Linux可执行文件&#xff0c;具体步骤如下&#xff1a; 1.安装环境 使用的工具是pyinstall…

linux 运行可执行文件

本文只为整理思路,供自己日后参考。现在就从从一个执行文件a.out的运行开始,自上而下地分析linux是如何运行一个执行文件的。 1、首先,需要了解一下a.out这个目标文件。a.out在linux下是ELF(Executable Linkable Format)文件格式,该目标文件由一个文件头、代码段、数据段…

从零编写linux0.11 - 第十一章 可执行文件

从零编写linux0.11 - 第十一章 可执行文件 编程环境&#xff1a;Ubuntu 20.04、gcc-9.4.0 代码仓库&#xff1a;https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载&#xff08;不能直接编译&#xff0c;需进行修改&#xff09; 本章目标 本章会加载并运行…

Linux可执行文件

文章目录 1. 什么是可执行文件2. 可执行文件的区别./ 表示什么?为什么是/usr/bin?总结 1. 什么是可执行文件 可执行文件指的是这个文件可以被运行.这个文件可以是一个代码文件,也可以是一个二进制文件 Linux文件系统中只有文件和目录(一切皆文件). 在Linux中,运行一个文件的…

技术人员如何创业(1)---产品及想法

不得不说这是个浮躁的社会&#xff0c;人人在这个社会都想暴富或者成名。在这些引诱的驱使下很多人都脱离了原来的稳定工作创业。前几天看了《中国合伙人》&#xff0c;故事讲到了几个大学生从校园到工作、再到创办了一个伟大的企业&#xff0c;这个故事更加激励了创业大军的壮…

蓝河科技10个月创立3.05亿美元的农业机器人公司

从创业构想到模式验证&#xff0c;仅10个月如何做到&#xff1f; 蓝河科技&#xff08;Blue River Technology&#xff09;是一家成立于2011年的农业机器人公司&#xff0c;总部位于硅谷&#xff0c;主营业务为设计、生产和销售农业机器人&#xff0c;农业机器人租赁业务和相关…

重新理解创业:一个创业者的途中思考

内容简介 易到用车创始人/顺为资本投资合伙人周航&#xff0c;首度复盘20年创业经历&#xff0c;全方位坦陈创业得与失。这不是一本创业成功手册&#xff0c;却是思想的一次出走。20年创业经历的咀嚼与反思&#xff0c;从战略、品牌、竞争&#xff0c;到流量、领导力、团队管理…

创业案例|10个月$3亿市值的农业智能科技如何实现

如何在10个月内快是实现创业从构想到模式验证&#xff0c;6年后以3个多亿美元成功被收购。本文是蓝河科技创始人Jorge和Lee自述&#xff0c;如何通过精益创业的关键三个阶段&#xff1a;客户问题匹配、问题方案匹配、方案市场匹配&#xff0c;实现了本成本试错、高效率推进的从…

计算机毕设题目推荐

计算机软件的朋友们不知道选什么题目的看过来啦&#x1f448; 图片中都是做过的毕设供大家参考&#xff0c;有源码的哦 ps&#xff1a;有新颖想法的宝子们也可以留言分享一下呢 #Java毕业设计 #计算机毕业设计 #计算机毕业设计怎么做

计算机毕设题目设计与实现(论文+源码)_kaic

毕业设计(论文)题目 高校图书馆座位预约选座微信小程序设计与实现 基于防火墙的访问控制系统的设计与实现 基于区块链的农产品追溯系统设计与实现 学生公寓楼改造布线系统规划与设计 智能家居网络设计与实现“互联网”农村精准扶贫共享平台的设计与实现“智慧健康少儿成长平台”…

计算机毕设选题推荐 40个高质量项目分享【源码+论文】(二)ssm+vue

文章目录 前言 课题1 : 基于SSM与VUE的房屋出租出售系统 <br /> 课题2 :基于SSM与VUE的租房信息管理系统 <br /> 课题3 : 基于SSM与VUE的个人健康信息管理系统 <br /> 课题4 : 基于SSM与VUE的共享充电宝管理系统 <br /> 课题5 : 基于SSM的健身运动平台…

计算机毕设太简单会不会过不了 SSM公司设备管理系统 企业员工工资管理系统 公司员工工资管理系统Java

精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设老哥&#x1f525; &#x1f496; Java实战项目专栏 Python实…

计算机java毕设_javaweb计算机毕设怎么做比较容易?

---计算机毕业生常见毕设 计算机毕业设计一般以网站多见 基于PHP网上留言系统JAVA打飞机游戏设计java图形图象处理系统JAVA银行帐目管理系统基于网络超市商品销售管理基于J2EE的公交查询系统JSP实验教学管理系统jsp进销存管理系统JSP网上书店系统JSP人力资源管理系统这些题目都…

计算机毕设如何做?点进来,干货分享。

该死的疫情席卷整个神州大地&#xff0c;不知道何时才是尽头&#xff0c;很多小伙伴都已经在家里开始种香菇了。面对遥遥无期的开学时间和即将面临的毕业最后一个大考&#xff08;毕业设计&#xff09;&#xff0c;心中即是期待又是无奈&#xff0c;陆陆续续在家这段时间&#…

【计算机毕设】项目数据库设计

计算机毕设系列文章目录 第一章 毕设题分析及设计 第二章 项目数据库设计 第三章 maven项目搭建 第四章 前端文件结构 第五章 后台登录功能实现 第六章 后台登出功能实现 第七章 项目功能实现 第八章 项目功能实现 第九章 项目功能实现 第十章 项目功能实现 文章目录 计算机毕…

计算机毕设系统项目说明 【源码+论文】

文章目录 1 项目下载步骤2 项目包含内容3 样例展示4 代码样例 1 项目下载步骤 &#x1f525;Hi&#xff0c;大家好&#xff0c;这里是学长开发的Java web项目系列&#xff0c;大家可以用于自己的课设或毕设。 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传…

计算机毕业设计选题推荐 40个高质量计算机毕设项目分享【源码+论文】(二)

文章目录 前言 题目1 : 基于SSM的房屋出租出售系统 <br /> 题目2 : 基于SSM的房屋租赁系统 <br /> 题目3 : 基于SSM的个人健康信息管理系统 <br /> 题目4 : 基于SSM的共享充电宝管理系统 <br /> 题目5 : 基于SSM的即动运动网站 <br />项目源码 前…

【计算机毕设】毕设题分析及设计

计算机毕设系列文章目录 第一章 毕设题分析及设计 第二章 项目数据库设计 第三章 maven项目搭建 第四章 前端文件结构 第五章 后台登录功能实现 第六章 后台登出功能实现 第七章 项目功能实现 第八章 项目功能实现 第九章 项目功能实现 第十章 项目功能实现 文章目录 计算机毕…

2022年 - 2023年 最新计算机毕业设计 本科 选题大全 汇总

文章目录 0 前言1 java web 管理系统 毕设选题2 java web 平台/业务系统 毕设选题3 游戏设计、动画设计类 毕设选题 (适合数媒的同学)4 算法开发5 数据挖掘 毕设选题6 大数据处理、云计算、区块链 毕设选题7 网络安全 毕设选题8 通信类/网络工程 毕设选题9 嵌入式 毕设选题10 开…