如何在动态链接库中调用外部函数?
大家好,我是一个动态链接库!
这个名字,相信你一定早就如雷贯耳了。
在计算机早期时代,由于内存资源紧张,我可是发挥了重大的作用!
不论是在 Windows 系统中,还是在 Unix 系列平台上,到处都能见到我的身影,因为我能为大家节省很多资源啊,资源就是人民币!
愉快的玩耍
比如:我的主人编写了这么一段简单的代码:
# 文件:lib.c
#include <stdio.h>
int func_in_lib(int k)
{
printf("func_in_lib is called ");
return k + 1;
}
只要用如下命令来编译,我就诞生出来了 lib.so,也就是一个动态链接库:
$ gcc -m32 -fPIC --shared -o lib.so lib.c
这个时候,主人随便把我丢给谁,我都可以为他服务,只要他调用我肚子里的这个函数 func_in_lib 就可以了。
虽然目前你看到我提供的这个函数很简单,但是道理都是一样的,后面如果有机会,我就在这个函数里来计算机器人的运动轨迹,给你瞧一瞧!
例如:张三今天写了一段代码,需要调用我的这个函数。
张三这个人比较喜欢骚操作,明明他在编译可执行程序的时候,把我动态链接一下就可以了,就像下面这样:
$ gcc -m32 -o main main.c ./lib.so
但是张三偏偏不这么做,为了炫技,他选择使用 dlopen 动态加载的方式,来把我从硬盘上加载到进程中。
咱们来一起围观一下张三写的可执行程序代码:
# 文件:main.c
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
typedef int (*pfunc)(int);
int main(int argc, char *agv[])
{
int a = 1;
int b;
// 打开动态库
void *handle = dlopen("./lib.so", RTLD_NOW);
if (handle)
{
// 查找动态库中的函数
pfunc func = (pfunc) dlsym(handle, "func_in_lib");
if (func)
{
b = func(a);
printf("b = %d ", b);
}
else
{
printf("dlsym failed! ");
}
dlclose(handle);
}
else
{
printf("dlopen failed! ");
}
return 0;
}
从代码中可以看到,张三预先知道我肚子里的这个函数名称是 func_in_lib,所以他使用了系统函数 dlsym(handle, "func_in_lib"); 来找到这个函数在内存中的加载地址,然后就可以直接调用这个函数了。
张三编译得到可执行文件 main 之后,执行结果完全正确,很开心!
悲从中来
可是有一天,我遇到一件烦人的事情,我的主人说:你这个服务函数的计算过程太单调了,给你找点乐子,你在执行的时候啊,到其他一个外部模块里调用一个函数。
话刚说完,就丢给我一个函数名:void func_in_main(void);。
也就是说,我需要在我的服务函数中,去调用其他模块里的函数,就像下面这样:
#include <stdio.h>
// 外部函数声明
void func_in_main(void);
int func_in_lib(int k)
{
printf("func_in_lib is called ");
// 调用外部函数
func_in_main();
return k + 1;
}
那么这个函数在哪里呢?天哪,我怎么知道这个函数是什么鬼?怎么才能找到它藏在内存的那个角落(地址)里?
不管怎么样,主人修改了代码之后,还是很顺利的把我编译了出来:
$ gcc -m32 -fPIC --shared -o lib.so lib.c
编译指令完全没有变化。
因为我仅仅是一个动态链接库,这个时候即使我不知道 func_in_main 函数的地址,也是可以编译成功的。
只不过我要把这个家伙标记一下:谁要是想使用我,就必须告诉我这个家伙的地址在哪里!,否则就别怪我耍赖。
最新活动更多
-
11月22日立即报名>> 【线下论坛】华邦电子与莱迪思联合技术论坛
-
11月28日立即报名>>> 2024工程师系列—工业电子技术在线会议
-
精彩回顾立即查看>> 【线下论坛】华邦电子与恩智浦联合技术论坛
-
精彩回顾立即查看>> 【在线会议】多物理场仿真助跑新能源汽车
-
精彩回顾立即查看>> 【限时免费下载】TE暖通空调系统高效可靠的组件解决方案
-
精彩回顾立即查看>> 2024德州仪器嵌入式技术创新发展研讨会
推荐专题
- 1 格科微5000万像素产品再传佳讯 剑指中高端手机后主摄市场
- 2 Kvaser发布全新软件CanKing 7:便捷CAN总线诊断与分析!
- 3 小米15供应链谁是大赢家?市场高度关注这家企业
- 4 Intel酷睿Ultra 9 285K首发评测:游戏性能一言难尽
- 5 锐龙7 9800X3D首发评测:网游断崖式领先
- 6 国补加持!双11最值得入手的Mini Led电视来了!不买真亏大了
- 7 小米入局家用NAS市场!手机厂商要做NAS普及推手?
- 8 HUAWEI SOUND 用科技开创智慧音响新世代
- 9 工业加热技术创造烘焙奇迹:Kanthal AF加热元件以37.55秒创造世界最短披萨烘焙时间
- 10 瑞典Ionautics HiPSTER 25重磅新品! SiC晶体管引领HiPIMS高效镀膜新时代,镀膜效率显著提升
发表评论
请输入评论内容...
请输入评论/评论长度6~500个字
暂无评论
暂无评论