Linux内核及分析 第七周 可执行程序的装载

实验步骤

1. 更新menu,用test.c覆盖test_exec.c

2. 把init 和 hello 放到了rootfs.img目录下,执行exec命令的时候自动加载了hello程序

3. 执行exec

4. 运行stopped的menu

5.  gdb进行跟踪分析

总结

1. 创建新进程

2. 新进程调用execve()系统调用执行指定的ELF文件

3. 调用内核的入口函数sys_execve(),sys_execve()服务例程修改当前进程的执行上下文;

当ELF被load_elf_binary()装载完成后,函数返回至do_execve()在返回至sys_execve()。ELF可执行文件的入口点取决于程序的链接方式:

1. 静态链接:elf_entry就是指向可执行文件里边规定的那个头部,即main函数处。

2. 动态链接:可执行文件是需要依赖其它动态链接库,elf_entry就是指向动态链接器的起点。

预处理、编译、链接和目标文件的格式

1.预处理阶段 :编译器将C源代码中包含的头文件编译进来和执行宏替换等工作。

gcc -E -o XX.cpp XX.c -m32 (XX.cpp是预处理文件)

2.编译器生成汇编代码阶段:gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。

gcc -x cpp-output -S -o hello.s hello.cpp -m32 (XX.s是汇编代码)

3.汇编器生成目标代码阶段:把编译阶段生成的XX.S文件转成二进制目标代码。

gcc -x assembler -c hello.s -o hello.o -m32 (XX.o是目标代码)

4.链接器生成可执行文件阶段(将编译输出XX.o文件链接成最终的可执行文件)。

gcc -o hello.static hello.c -m32 -static

5.运行(若链接没有-o指明,则生成可执行文件默认为a.out)

./a.out

目标文件的格式ELF:

A.out是最古老的可执行文件,目前Windows系统上多是PE,Linux系统上多是ELF。ELF文件已经是适应到某一种CPU体系结构的二进制兼容文件了

ELF格式分类:

可重定位文件.o,用来和其他object文件一起创建可执行文件和共享文件

可执行文件,指出应该从哪里开始执行

共享文件,主要是.so文件,用来被链接编辑器和动态链接器链接

对ELF头的描述告诉系统如何创建一个进程的内存映像,section头表包含了描述文件sections的信息。当创建或增加一个进程映像时,理论上它会把程序段拷贝到虚拟内存中某个段

ELF文件的头部规定了许多与二进制兼容性相关的信息。所以在加载ELF文件的时候,必须先加载头部,分析ELF的具体信息

entry代表刚加载过新的可执行文件之后的程序的入口地址,头部后是代码和数据,进程的地址空间是4G,上面的1G是内核用,下面的3G是程序使用。默认的ELF头加载地址是0x8048000

在创建一个新的用户态堆栈的时候,实际上是把命令行参数的内容和环境变量的内容通过指针的方式传递到系统调用的内核处理函数的,内核处理函数在创建一个新的可执行堆栈的时候会将命令行参数的内容和环境变量的内容拷贝到用户态堆栈里面来初始化新的可执行程序执行的上下文环境

时间: 2024-09-29 00:58:00

Linux内核及分析 第七周 可执行程序的装载的相关文章

20135327郭皓--Linux内核分析第七周 可执行程序的装载

第七周 可执行程序的装载 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一.预处理,编译,链接和目标文件格式 1.可执行程序是怎么得来的 c代码->预处理->汇编代码->汇编器->目标代码->链接成可执行文件->加载到内核执行 2.目标文件的格式ELF 符号修饰标准.变量内层布局.函数调用方式等这些跟可执行代码二进制兼容性相关的内容称为ABI

LINUX内核分析第七周——可执行程序的装载

一.得到一个可执行程序 1. 预处理.编译.链接 gcc hello.c -o hello.exe gcc编译源代码生成最终可执行的二进制程序,GCC后台隐含执行了四个阶段步骤. 预处理 => 编译 => 汇编 => 链接 预处理:编译器将C源代码中包含的头文件编译进来和执行宏替换等工作. gcc -E hello.c -o hello.i 编译:gcc首先要检查代码的规范性.是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言. gcc –S hell

20135201李辰希 《Linux内核分析》第七周 可执行程序的装载

李辰希  原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 编译链接的过程 1.预处理阶段 gcc -E -o XX.cpp XX.c -m32 XX.cpp是预处理文件 2.编译器生成汇编代码阶段 gcc -x cpp-output -S -o hello.s hello.cpp -m32 XX.s是汇编代码 3.汇编器

Linux内核及分析 第六周 分析Linux内核创建一个新进程的过程

实验过程 1.github上克隆相应的mengning/menu.git 2.测试menuOS,测试fork直接执行结果 3.配置调试系统,进入gdb调试,利用file linux-3.18.6/vmlinux和target remote:1234来配置加载初始调试环境 4.在linux内核进程创建可能用到的点设置断点分别为sys_clone,do_fork,dup_task_struct,copy_thread,copy_process和ret_from_fork. 总结: 1.通过调用do_

Linux内核及分析 第五周 扒开系统调用的三层皮(下)

实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的menu 3.在test.c中,在main函数中增加两个MenuConfig 4.增加对应的GetPid函数和GetPidAsm函数 5.通过脚本 make rootfs,编译并运行Menu 6.设置断点使用gdb跟增系统调用内核函数sys_time 系统调用是一种中断: 1. 保存现场 在系统调用时,我

Linux内核及分析 第三周 Linux内核的启动过程

实验过程: 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootfs.img 执行完毕后会弹出QEMU窗口,输出Linux内核启动信息,启动成功后显示Menuos 输入help,提示该精简的系统支持三个命令:help.version.quit 使用gdb跟踪调试内核 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel li

Linux内核及分析 第八周 进程的切换和系统的一般执行过程

学习笔记: 一.进程调度与进程调度的时机分析 1.不同类型的进程有不同需求的调度需求: 第一种分类: —I/O-bound:频繁的进行I/O,通常会花费很多时间等待I/O操作的完成 —CPU-bound:计算密集型,需要大量的CPU时间进行运算 第二种分类: —批处理进程:不必与用户交互,通常在后台运行:不必响应很快: —实时进程:有实时需求,不被低优先级的进程阻塞:响应时间短,稳定: —交互式进程:需要经常与用户交互:响应时间要快 2.调度策略:一组规则,决定什么时候以怎样的方式选择一个新的进

Linux内核分析——第七周学习笔记20135308

第七周 可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么来的 C代码—>预处理—>汇编代码—>目标代码—>可执行文件 .asm汇编代码 .o目标码 a.out可执行文件 预处理负责把include的文件包含进来及宏替换工作. 2.目标文件的格式ELF (1)常见的ELF格式文件: (2)ABI——应用程序二进制接口 在目标文件中,他已经是二进制兼容,即适应二进制指令. (3)ELF中三种目标文件: 一个可重定位(relocatable)文件保存着代码和

第七节 可执行程序的装载

第七周 可执行程序的装载 By 20135217孙小博 本周的主要内容: 可执行程序是如何得到的以及可执行程序的目标文件格式 动态库 &动态链接库 系统调用sys_exec函数的执行过程 预处理.编译.链接和目标文件的格式 可执行程序是如何得来的 预处理:gcc –E –o hello.cpp hello.c -m32 //负责把include的文件包含进来,宏替换 编 译:gcc -x cpp-output –S hello.s –o hello.cpp -m32 //gcc –S调用ccl,