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

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

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

由源代码生成可执行文件

预处理 => 编译 => 汇编 => 链接

gcc -E hello.c -o hello.i
gcc –S hello.i –o hello.s
gcc –c hello.s –o hello.o
gcc hello.o –o hello

若无-o指明,生成可执行文件默认为a.out

目标文件格式

目标文件分为PE(windows)和ELF(linux)。

查看ELF文件头部方法:readelf

静态链接ELF可执行文件默认入口点:0x8048000

动态链接执行方法:

$ gcc main.c -o main -L/path/to/your/dir -lshlibexample -ldl -m32
$ export LD_LIBRARY_PATH=$PWD 
/*将当前目录加入默认路径,否则main找不到依赖的库文件,当然也可以将库文件copy到默认路径下。*/

-L + 路径 或者 -l + 库名

静态链接和动态链接的区别

静态连接:elf_entry指向可执行文件头部,是新程序执行的起点

动态链接:elf_entry指向ld(动态链接器)的起点,加载load_elf_interp

实验:GDB调试sys_execve执行过程







总结:execve的执行过程在前半段和fork类似创建一个新进程,但是在后半段通过sys_execve调用新的程序进入内存执行,使得新程序覆盖了旧程序的数据,实现了新进程的创建

posted on 2016-04-10 16:29  5319zl  阅读(151)  评论(0编辑  收藏  举报

导航