码迷,mamicode.com
首页 > 系统相关 > 详细

《linux 内核分析》 第7周 可执行程序的装载

时间:2017-04-10 00:38:51      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:文件加载   加载   汇编   size   style   lin   占用   内核   read   

王一+《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-100002900

一、理解编译链接的过程和ELF可执行文件格式;

1、编译链接过程

  1. 编译器预处理成cpp文件
    gcc -E -o q.cpp q.c -m32
  2. 汇编器编译成汇编代码  -x是将编译cpp输出文件,输出汇编文件

    gcc -x cpp-output -S -o hello.s hello.cpp -m32
  3. 汇编代码编译成二进制目标文件  -x将汇编编译为object文件
    gcc -x assembler -c hello.s -o hello.o -m32

    4.链接成可执行文件  静态链接成hello.static文件

   gcc -o hello.static hello.c -m32 -static 
2、查看elf头文件格式
readelf -h hello

   Entry_point_address代表程序的入口地址,默认的加载地址是0x8048000,也就是可执行文件加载到内存之后执行的第一条代码地址,

 一般静态链接会将所有代码放在一个代码段;动态链接的进程会有多个代码段.

 

二、编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链接和运行时动态链接,编程练习动态链接库的这两种使用方式;

 elf(Executable and Linking Format)
 其三种类型:
(1)可重定位文件
也就是通常称的目标文件,后缀为.o。链接器将它作为输入和其他目标文件,生成一个可执行的对象文件 (Executable file) 或者一个可被共享的对象文件。
(2)共享文件
这些就是所谓的动态库文件,也即 .so 文件。如果拿前面的静态库来生成可执行程序,那每个生成的可执行程序中都会有一份库代码的拷贝。如果在磁盘中存储这些可执行程序,那就会占用额外的磁盘空间;另外如果拿它们放到Linux系统上一起运行,也会浪费掉物理内存。如果将静态库换成动态库,那么这些问题都不会出现。
(3)可执行文件

保存着一个用来执行的文件,该文件指出了exec如何创建程序进程映像。

 

 

 

 

 

使用gdb跟踪分析一个execve系统调用内核处理函数sys_execve ,验证对Linux系统加载可执行程序所需处理过程的理解

特别关注新的可执行程序是从哪里开始执行的?为什么execve系统调用返回后新的可执行程序能顺利执行?对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?

 

《linux 内核分析》 第7周 可执行程序的装载

标签:文件加载   加载   汇编   size   style   lin   占用   内核   read   

原文地址:http://www.cnblogs.com/tomyco/p/6687027.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!