Linux内核分析课程-- Linux内核如何装载和启动一个可执行程序

来源:互联网 发布:微信监控软件 编辑:程序博客网 时间:2024/05/06 07:08

齐昱博 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 

1、课上总结:

(1)、编译链接的过程和ELF可执行文件格式

从一个源代码文件到一个可执行程序文件大概要经历如下过程:


以hello.c为例:

//hello.c#include <stdio.h>int main(){    printf("hello world!");    return 0;}


(2)、ELF可执行文件格式

ELF中有三种主要的目标文件


查看可执行文件的头部使用readelf指令

可执行文件的头部分别指明了版本号、OS/ABI、ABI的版本号、是可执行文件还是目标文件、入口地址等。

入口地址为程序真正开始的位置,它的地址减去0x8048000的数值为头文件大小。

(3)、使用exec*库函数加载一个可执行文件的过程

静态链接,只要传递命令行参数和环境变量就可以正常工作

动态链接,除了以上两种输入还要一些动态链接库的依赖

动态链接分为可执行程序装载时动态链接和运行时动态链接


在main函数中调用动态加载共享库时需要用到dlopen;


2、实验部分:

实验目标:使用gdb跟踪分析一个execve系统的调用内核处理函数sys_excve

(1)、首先把实验要用到的代码写入test.c中



(2)make rootfs



(3)、使用gdb跟踪,设置断点(sys_execve , load_elf_binary , start_thread)




输入命令触发断点:

第一个断点:

按s,单步执行:


按c,继续执行:


按c,继续执行,发现停在了start_thread,使用命令查看new_ip的值,它等于0x8048d0a,再打开一个shell,使用命令readelf -h hello查看hello的elf头部,可以看到elf头部中的程序入口点地址正是0x8048d0a




0 0
原创粉丝点击