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. 运行结果

此时文件夹内文件如下:

android so动态库反编译 .so动态库_动态库


运行test,输入数字,运行结果如下:

android so动态库反编译 .so动态库_动态链接库_02

以上。