实验七:Linux 内核如何装载和启动一个可执行程
一、理解编译链接的过程和ELF可执行文件格式。
a.程序从源代码到可执行文件的步骤:预处理、编译、汇编、链接。
预处理:
gcc -E hello.c -o hello.i
编译:
gcc -S hello.i -o hello.s -m32
汇编:
gcc -c hello.s -o hello.o -m32
链接:
gcc hello.o -o hello -m32 -static
b.ELF文件格式可分为三种:
(1)可重定位文件:这种文件一般是中间文件,还需要继续处理。由编译器和汇编器创建,一个源代码文件会生成一个可重定位文件。文件中保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件、静态库文件或者共享目标文件(即动态库文件)。
(2)可执行文件:一般由多个可重定向文件结合生成,是完成了所有重定位工作和符号解析(除了运行时解析的共享库符号)的文件,文件中保存着一个用来执行的程序。
(3)共享目标文件:共享库,是指可以被可执行文件或其他库文件使用的目标文件,例如标准C的库文件libc.so。可以简单理解为没有主函数main的“可执行”文件,只有一堆函数可供其他可执行文件调用。Linux下共享库后缀为.so的文件,so代表shared object。
二、练习动态链接库的两种方式
链接是将各种代码和数据部分收集起来并组合成一个单一文件的过程,这个文件可被加载(或被复制)到内存中并执行。
a.静态链接和动态链接
如下动态链接的可执行文件只有7294字节,而静态链接版本大小约其100倍。
动态链接分为可执行程序装载时动态链接和运行时动态链接,接下来介绍这两种动态链接。
b.装载动态链接
shlibexample.h源代码如下:
shlibexample.c的源代码如下:
c.运行时动态链接
dllibexample.h的源代码如下:
dllibexample.c的源代码如下:
三、实验
(1)将menu目录删除,利用git命令克隆一个新的menu目录。