2018-2019-1 20189210 《LInux内核原理与分析》第八周作业

本文详细介绍了可执行程序的工作原理,包括程序编译过程中的预处理、编译、汇编和链接步骤,以及ELF文件格式。对比了静态链接与动态链接的可执行文件,并通过实验使用gdb跟踪分析了execve系统调用内核处理函数。

一 、可执行程序工作原理
程序编译
预处理:gcc -E hello.c -o hello.i
编译:gcc -S hello.i -o hello.s -m32
汇编:gcc -c hello.s -o hello.o -m32
链接:gcc hello.o -o hello -m32 -static
其中用gcc -o hello.static hello.o -static静态编译出来的hello.static把C库里需要的东西也放到可执行文件里了,所以hello.static比较大。
1510233-20181202201401570-1214084448.png
ELF(Excutable and Linking Format)是一个文件格式的标准。通过readelf-h hello查看可执行文件hello的头部(-a查看全部信息,-h只查看头部信息),头部里面注明了目标文件类型ELF32。Entry point address是程序入口,地址为0x8048310,
即可执行文件加载到内存中开始执行的第一行代码地址。头部后还有一些代码数据等等。可执行文件的格式和进程的地址空间有一个映射的关系,当程序要加载到内存中运行时,将ELF文件的代码段和数据段加载到进程的地址空间。
ELF文件里面三种目标文件:可重定位(relocatable)文件保存着代码和适当的数据,用来和其它的object文件一起来创建一个可执行文件或者是一个共享文件(主要是.o文件);
可执行(executable)文件保存着一个用来执行的程序,该文件指出了exec(BA_OS)如何来创建程序进程映象(操作系统怎么样把可执行文件加载起来并且从哪里开始执行);
共享object文件保存着代码和合适的数据,用来被两个链接器链接。第一个是链接编辑器(静态链接),可以和其它的可重定位和共享object文件来创建其它的object。第二个是动态链接器,联合一个可执行文件和其它的共享object文件来创建一个进程映象。
1510233-20181202201903545-799693128.png

二、静态链接与动态链接的可执行文件对比
编写了一个hello.c文件,输出hello world。在使用gcc -static -o hello.m32.static hello.c生成了hello.m32.static静态链接的可执行文件,用gcc -o hello.m32.dynamic hello.c生成了hello.m32.dynamic动态链接的可执行文件
1510233-20181202203512590-2091674175.png
1510233-20181202203712956-1813058253.png
1510233-20181202203531049-92761020.png
1510233-20181202203547590-981160165.png
1510233-20181202203647675-190923034.png
1510233-20181202203710974-1614638535.png
1510233-20181202204221427-737967742.png

三、实验:使用gdb跟踪分析execve系统调用内核处理函数sys_execve。
首先还是将menu目录删除,用git命令复制一个新的menu目录,用test_exec.c将test.c覆盖,然后重新编译rootfs:
1510233-20181202204225064-1735563239.png
查看代码我们发现,在test.c中新增了exec函数
1510233-20181202204446443-1166505211.png
设置断点
1510233-20181202205348967-1299328378.png

运行至断点处,使用list查看代码;使用step进入sys_execve函数内部发现调用了“do_execve()”。
1510233-20181202205354907-1383130903.png
1510233-20181202205417665-1431854690.png
继续执行到“start_thread”处的断点,因为是静态链接,“elf_entry”指向了可执行文件中定义的入口地址,使用po new_ip指令打印其指向的地址,“new_ip”是返回到用户态的第一条指令的地址:
1510233-20181202205053106-1056638675.png
查看hello的elf头部,发现与定义的入口地址与new_ip所指向的地址一致。
1510233-20181202205437504-2082271706.png

转载于:https://www.cnblogs.com/20189210mujian/p/10055249.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值