先列出书中一个例子的简单代码实现,以展示动态链接过程。
Lib.h
#ifndef LIB_H
#define LIB_H
void foobar(int i);
#endif
Lib.c
#include<stdio.h>
void foobar(int i)
{
printf("Printing from Lib.so %d\n", i);
}
Program1.c
#include "Lib.h"
int main()
{
foobar(1);
return 0;
}
Program2.c
#include "Lib.h"
int main()
{
foobar(2);
return 0;
}
1、将Lib.c编译成动态库(共享对象文件)
gcc -fPIC -shared Lib.so Lib.c
其中:
-fPIC作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code)。在生成的代码中,全部使用相对地址,因此代码可以被加载器加载到内存的任意位置,都可以正确的被执行。
-shared表示产生共享对象。
2、编译链接两个主程序+Lib.so,生成可执行文件
gcc -o Program1 Program1.c Lib.so
gcc -o Program2 Program2.c Lib.so
如下图所示。
上述动态链接过程如下图所示。
3、模块的定义
以上只是知识的搬运。