0x00 前言
文章中的文字可能存在语法错误以及标点错误,请谅解;
如果在文章中发现代码错误或其它问题请告知,感谢!
运行环境 :
Linux version 4.2.0-42-generic (buildd@lgw01-05) (gcc version 5.2.1 20151010 (Ubuntu 5.2.1-22ubuntu2) )
#49-Ubuntu SMP Tue Jun 28 21:24:45 UTC 2016
0x01 动态函数库(.so)
动态函数库简称动态库(.so),相对于静态库,名命方式一般为libxxx.so,动态库在编译的时候没有编译到目标程序中 ,也就是没有被整合到目标程序中,它只有在程序运行时才被载入。动态库的改变并不会影响目标程序,所以动态库的更新或升级是比较方便的。另外,当不同的应用程序如果调用相同的库,那么在内存中只需要有一份该动态库(共享库)的实例即可。
0x02 Linux下生成和加载动态库的一般步骤
Linux下生成和加载动态库的步骤如下:
1.编写源代码文件(.c);
2.将该源文件编译链接,生成动态链接库(.so);
3.为动态链接库生成接口文件(.h),引用到目标程序中;
4.将动态链接库(.so)放入指定 LD_LIBRARY_PATH或指定目录,运行需要该库的程序。
0x03 实例演示
1.编写源文件:
建立一个源文件,名命func.c:
#include<stdio.h>
int func(int a)
{
printf("func receive num is %d\n", a);
return 0;
}
2.编译生成动态链接库.so:
输入指令:
gcc -g -rdynamic func.c -fPIC -shared -o libfunc.so
3.为该动态库编写接口文件:
为了让用户指导动态库里面有哪些接口可以使用,需要另外编写库里面函数的接口文件,也就是头文件。名命我们的头文件为func.h:
#ifndef FUNC_H
#define FUNC_H
int func(int a);
#endif
4.使目标程序链接动态库
现在编写一个目标程序,命名为main.c,该程序需要使用到该动态库中的func()函数:
#include<stdio.h>
#include"func.h"
int main()
{
int temp = 0;
printf("Please input your num:");
scanf("%d", &temp);
(void)func(temp);
return 0;
}
编译,将该目标程序链接到动态库:
gcc -g -rdynamic main.c -L. -lfunc -Wl,-rpath=. -o test
-L.:编译时链接当前目录的. so。
-Wl,-rpath=.:指定程序执行时动态链接库搜索路径为当前目录,否则会出现执行找不到.so的错误。
5. 运行结果
此时文件夹内文件如下:
运行test,输入数字,运行结果如下:
以上。