作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第八周作业> |
这个作业的目标 | <Linux内核如何装载和启动一个可执行程序> |
作业正文 | https://www.cnblogs.com/baoxiyuan/p/14028515.html |
1.ELF文件的作用
1.如果用于编译和链接,则编译器和链接器将把ELF文件看做节的集合,所有节由节头表描述,程序头表可选。
2.如果用于加载执行,则加载器将把ELF文件看做程序头表描述的段的集合,一个段可能包含多个节和节头表可选。
3.如果是共享文件,则两者都包含。
2.程序从源代码到可执行文件的步骤
预处理
gcc -E hello.c -o hello.i
编译、
gcc -S hello.i hello.s -m32
汇编
gcc -C hello.s -o hello.o -m32
链接
gcc hello.o -o hello -m32 -static
3.静态链接与动态链接
1.静态链接
在编译链接时直接将需要的执行代码复制到最终可执行文件中,有点事代码的装载速度快,执行速度也比较快,对外部
环境依赖度低。编译时它会把需要的所有代码都链接进去,应用程序相对比较大,缺点是如果多个应用程序使用同一库函数,
会被装载多次,浪费内存。
2.动态链接
在编译时不直接复制可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统。操作系统
负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库去执行代码,最终达到
运行时链接的目的。优点是多个程序可以共享同一段代码,而不需要在磁盘上存储多个复制。缺点是在运行时加载,可能会影响程序
的前期执行性能,而且对使用的库依赖性较高,在升级时特别容易出现版本不兼容的问题。
4.命令行参数和环境变量保存
5.
启动内核
查看test.c代码
设置断点,进行单步调试