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

齐昱博 + 原创作品转载请注明出处 + 《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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值