首页 > 代码库 > 《linux 内核分析》 第7周 可执行程序的装载
《linux 内核分析》 第7周 可执行程序的装载
王一+《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-100002900
一、理解编译链接的过程和ELF可执行文件格式;
1、编译链接过程
- 编译器预处理成cpp文件
gcc -E -o q.cpp q.
c -m32
-
汇编器编译成汇编代码 -x是将编译cpp输出文件,输出汇编文件
gcc -x cpp-
output -S -o hello.s hello.cpp -m32
- 汇编代码编译成二进制目标文件 -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周 可执行程序的装载