可执行程序的装载

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

1.可执行程序怎么来的?

  预处理:

      gcc -E -o hello.cpp hello.c -m32

      *负责把include的文件包含进来及宏替换

  编译:

      gcc -x cpp-output -S -o hello.s hello.cpp -m32

      gcc -x assembler -c hello.s 0o hello.o -m32

      hello.s 汇编代码

      hello.o 二进制文件

  链接:

      gcc -o hello hello.o - -m32

2.目标文件的格式ELF

  A.out         COFF   (PE+ELF)

  三种类型:

      可重定位文件

      可执行文件

      共享文件

  Entry point address 程序的起点

3.静态链接的ELF

   静态链接会将所有代码放在一个代码段

   动态链接会有多个代码段

二、可执行程序,共享库,和动态链接

1.装载可执行程序程序之前的工作

  执行环境:命令行+参数

  *shell本身不限制命令行参数的个数

  *shell会调用execve将命令行参数和环境参数传递给main函数

  shell>execve>sys_exceve

  *初始化新程序堆栈时拷贝进去

  *先函数调用参数传递,再系统调用参数传递

2.装载时动态链接和示例

三、可执行程序的装载

1.相关关键问题分析

  fork先返回父进程一次;再返回ret_from_fork开始执行然后返回用户态

  sys_execve:

        do_exceve>do_execve_common>exec_binprm

  通过修改内核堆栈中EIP的值作为新程序的起点

2.sys_exceve的内部处理

  

  对于静态链接的文件elf_entry是新程序执行的起点

3.gdb跟踪

  new_ip是返回到用户态的第一条指令的地址

实验:

1、

静态链接

  静态链接是在链接时将库的内容加入到可执行程序中的做法。因为要将所有需要的库文件放到同一个文件中,所以占用空间会比较大,但是执行效率非常高。

动态链接

  动态链接是当需要某个头文件时动态的去库中去找,并不用像静态链接那样去提前全部加载进去。这样链接出来的文件相对来说空间较小,但是效率略逊于静态链接。

  动态链接分装载时动态链接和运行时动态链接。两者在gcc下指令相同,但是使用方式略有不同。

Linux下的三种目标文件格式
1.可重定位文件( .o ):二进制代码和数据,由各个数据节(section)构成,从地址0开始。
2.可执行文件:可运行的二进制代码和数据。
3.共享目标文件( .so ):一种特殊类型的可重定位目标文件,动态加载链接。

Linux上,目标文件的格式称为可执行和可链接格式(ELF)

2.步骤

 cd LinuxKernel

rm -rf menu

git clone https:///mengning/menu.git

cd menu

mv test_fork.c test.c

make rootfs

qemu -kernel linux-3.18.6/arch/x86/bootImage -initrdrootfs.img -s -S
  
打开gdb进行远程调试

gdb

file linux-3.18.6mlinux

target remote:1234

B sys_execve

B load_elf_binary

B start_thread

  

linux首先创建父进程,然后通过调用fork()系统调用创建一个新的进程,然后新的进程调用execve()系统调用执行指定的ELF文件。 主进程继续返回等待新进程执行结束,然后重新等待用户输入命令。execve()系统调用被定义在unistd.h。

对于ELF格式的可执行文件,按照格式要求加载到内存中相应的地址空间,如果是静态链接的就将文件头部标明的入口地址作为开始;如果是依赖动态链接库的可执行文件则需要将动态链接器ld的入口地址作为开始。

Linux内核分析(第七周)的更多相关文章

  1. LINUX内核分析第七周学习总结:可执行程序的装载

    LINUX内核分析第七周学习总结:可执行程序的装载 韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

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

    张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核分析 第七 ...

  3. LINUX内核分析第七周学习总结

    LINUX内核分析第七周学习总结 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.c ...

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

    Linux内核分析第七周---可执行程序的装载 李雪琦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...

  5. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  6. LINUX内核分析第七周学习总结——可执行程序的装载

    LINUX内核分析第六周学习总结——进程的描述和进程的创建 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cours ...

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

    第七周 可执行程序的装载 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 ...

  8. linux内核分析 第七周

    一.课堂相关 (一)预处理.编译.链接和目标文件的格式 1.可执行程序是怎么得来的 C代码--预处理--汇编代码--目标代码--可执行文件 预处理负责把include的文件包含进来及宏替换工作. he ...

  9. "Linux内核分析"第七周

    可执行程序的装载 张文俊+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.预 ...

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

    第七周 可执行程序的装载 一.预处理.编译.链接和目标文件的格式 1.可执行程序是怎么来的 C代码—>预处理—>汇编代码—>目标代码—>可执行文件 .asm汇编代码 .o目标码 ...

随机推荐

  1. 【Excel】SUMIF函数的兼容性

    兼容性非常强的两个函数 SUMIF() 说兼容性,当然得说SUMIF了. 来,我们先举个例子. 现有一个表格,算起来只有"科目划分"."发生额"两列内容,但是折 ...

  2. IO流_文件切割与合并

    切割可以分两种方式:按文件个数切,按文件大小来切(建议用这种方式,因为按个数的话,有可能文件非常大) import java.io.File; import java.io.FileInputStre ...

  3. 计算器和Menu

    MainActivity.java import android.app.Activity; import android.content.Intent; import android.os.Bund ...

  4. 「PKUSC2018」神仙的游戏

    题目链接 比如说上面\(|S|\)为12的字符串,我们欲求出\(f(9)\)的值,那么上面相同颜色的字符必须两两能够匹配.也就是说,同种颜色的字符集里不能同时出现0和1.如果只考虑同种颜色集里相邻的两 ...

  5. (11)Python包

  6. 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)

    思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...

  7. Ubuntu 16.04 下部署Node.js+MySQL微信小程序商城

    转载于这篇文章 关于pm2看这篇文章 最近在研究小程序,申请了域名之后,再一次来配置环境,根据作者的步骤基本上完成了网站的架构,但由于环境路径等不同,配置上会有所不同,因此记录下来. 1.更新系统和安 ...

  8. Luogu P2261 [CQOI2007]余数求和

    最近中考放假几天都在怼一道BJOI2018的水题,但卡死在90pts跑不动啊! 然后今天发现终于过了然而Hack的数据全RE了然后就开始找新的题目来找回信心. 然后发现智能推荐里有这道题,然后想了1m ...

  9. [Python]Practice makes perfect

    Practice makes perfect 发音被儿子鄙视了.需要加强练习 以此自勉.

  10. java jdk 配置

    1.配置 C:\Program Files\Java\jdk1.8.0_131\bin 路径 到环境变量 Path