Linux C 动态库(.so)的生成和加载

34 篇文章 6 订阅

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,输入数字,运行结果如下:
在这里插入图片描述

以上。

参考文档:
1.https://www.cnblogs.com/jiqingwu/p/linux_dynamic_lib_create.html
2.https://www.cnblogs.com/52php/p/5681017.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值