第7节 Linux内核如何装载和启动一个可执行程序【Linux内核分析】

本文详细分析了Linux内核如何通过exec*函数加载和启动可执行程序,涉及elf文件格式、动态链接库、系统调用sys_execve的处理过程。通过实验和gdb调试,探讨了静态链接和动态链接程序在execve调用后的执行差异,并介绍了start_thread函数在其中的作用。
摘要由CSDN通过智能技术生成

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

一、实验要求

分析exec*函数对应的系统调用处理过程

二、实验内容

  • 理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节;
  • 编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式,详细内容参考本周第二节;
  • 使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve ,验证您对Linux系统加载可执行程序所需处理过程的理解,详细内容参考本周第三节;推荐在实验楼Linux虚拟机环境下完成实验。
  • 特别关注新的可执行程序是从哪里开始执行的?为什么execve系统调用返回后新的可执行程序能顺利执行?对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?

三、实验环境

本地linux环境(ubuntu14.04 64bit)

主要优点:使用方便,方便保存,不受网络影响。

四、实验过程

1.可执行文件的生成过程。

首先引用一张孟老师的图,来说明可执行文件生成的过程,总结的很赞

这里写图片描述

可执行文件是给计算机中的cpu执行的二进制代码。按照老师上课使用的shell命令演示一下。

这里写图片描述

hello.static 是静态链接编译的可执行文件,可以很看到,比动态链接编译的hello文件要大得多,相差100倍,原因也很简单,就是静态链接是将程序中需要使用的库都放在了静态编译的文件中,导致文件大小剧增。

演示很简单,两个的效果表面是看不出来的

这里写图片描述

2.查看elf文件相关信息

对于静态链接的elf文件,基本上在加载时对应加上程序入口地址,将相应的代码数据加载到对应的内存空间中,然后逐步执行代码。以下是我的ELF Header情况。

这里写图片描述

下面来查看elf头信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值