linux下动态链接的例子有很多,我从网上找到了一个,如下
动态链接示例地址:
https://blog.csdn.net/fuyuande/article/details/82913961

对于main函数,我稍微修改了下,添加了printf打印一些地址

#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>void main()
{void *handle;void (*hello)(void);/* 加载libHelloWorld.so */handle = dlopen("libHelloWorld.so", RTLD_LAZY);if (!handle){printf("open libHelloWorld.so fail\r\n");return;}printf("handle is %p\n", handle);/* 引用库提供的symbol,可以是变量也可以是函数 */hello = dlsym(handle, "hello");if ( !hello ){printf("open symbol fail\r\n");dlclose(handle);return;}printf("address of hello function is %p\n", hello);/* 调用库函数 */hello();while(1);/* 释放库的引用计数 */dlclose(handle);return;
}

控制台输出的结果如下:
[root@localhost learn]# ./dllib
handle is 0x152a040
address of hello function is 0x7f1898c09665
Hello World

从上面的运行结果看,很明显,是64位的进程。
在windows操作系统下,与dlopen对应的是LoadLibrary函数,LoadLibrary返回的是dll加载于进程虚拟地址空间的地址,具有非常明确的含义。但是linux下的dlopen返回的handle是0x152a040,这个很明显,不是so加载到进程虚拟地址空间的地址。

此进程号为16492,我们使用命令cat /proc/16492/maps,打印结果如下

此处,我们加载的动态库是libHelloWorld.so,从图中可以看出此动态库加载到进程地址空间的起始地址是7f1898c09000,这个与main函数中打印出的hello函数的地址0x7f1898c09665非常接近,差了一个0x665,这个0x665实际上就是hello函数在动态库libHelloWorld.so里面的偏移地址,可以从nm命令验证这一点,如下所示:
[root@localhost learn]# nm libHelloWorld.so |grep hello
0000000000000665 T hello

所以,跟windows一样,动态库里面函数在内存空间的地址,其实就是动态库在进程空间的地址+此函数在动态库里面的偏移地址。

下面给出动态库libHelloWorld.so的头文件和.c文件代码,以免上面的链接丢失

//实现文件 HelloWorld.c
/***  简单动态库文件使用*/
#include "HelloWorld.h"void hello(void)
{printf("Hello World \r\n");return ;
}//头文件 HelloWorld.h
#include <stdio.h>void hello(void);

linux下dlsym返回的函数地址的具体含义相关推荐

  1. Linux下的内存对齐函数

    在Linux下内存对齐的函数包括posix_memalign, aligned_alloc, memalign, valloc, pvalloc,其各个函数的声明如下: int posix_memal ...

  2. Linux 下调用UEFI的函数

    Linux 下调用UEFI的函数 摘要 Linux 调用UEFI function 时候调用约定的转换 64bits calling convention Microsoft calling conv ...

  3. Linux系统常用函数,浅谈linux下的一些常用函数的总结(必看篇)

    1.exit()函数 exit(int n)  其实就是直接退出程序, 因为默认的标准程序入口为int main(int argc, char** argv),返回值是int型的. 一般在shell下 ...

  4. linux下c语言使用mac地址进行socket通信

    linux下c语言使用mac地址进行socket通信 server端: #include <unistd.h> #include <stdio.h> #include < ...

  5. (原创)Linux下一定要4字节地址对齐操作

    Linux下一定要4字节地址对齐操作:"血"的教训,一定不要忘记!!! 当然不仅仅是Linux下,所有的32位机都应该如此!!!

  6. linux uname内核,Linux下confstr与uname函数_获取C库与内核信息

    Linux下confstr与uname函数_获取C库与内核信息 #include #include  //uname int main(int argc, char **argv[]) { struc ...

  7. linux内核设置mac地址,Linux下如何修改网卡MAC地址

    Red Hat Linux下如何修改网卡MAC地址 OS版本:Red Hat Enterprise Linux AS4 核心:Kernel 2.6.9-42 网上有很多关于linux下修改MAC地址的 ...

  8. Linux系统怎么编译sin,linux下gcc编译sin函数出错的问题

    linux下gcc编译sin函数出错的问题 收藏 Q: I keep getting errors due to library functions being undefined, but I'm ...

  9. linux下获取本机IPv6地址、前缀、网关

    原文:linux下获取本机IPv6地址.前缀.网关 获取本机IPv6信息命令:cat /proc/net/if_inet6 root@IT-PC-135:/home/user1/# cat /proc ...

最新文章

  1. mybatis {arg0} 与 {0}
  2. boost::hana::index_if用法的测试程序
  3. PHP常用 header函数设置HTTP头部示例
  4. vins中imu融合_VINS-Mono代码分析与总结(最终版)
  5. 用 Python 实现打飞机
  6. 操作系统——实验壹——熟悉Linux基础命令及进程管理
  7. I.MX6 mkuserimg.sh hacking
  8. vue项目打包部署linux_Vue项目打包部署到Nginx服务器
  9. mybatis当输入参数有多个时的解决方案,Map类型,索引引用输入参数,map输出
  10. pcb钻孔披锋改善报告_钻孔孔钻偏改善报告
  11. 对网站的文件和资源进行优化、前端开发优化
  12. wordpress and theme
  13. J2ME-CLDC/MIDP资源
  14. 立创EDA封装命名规范参考
  15. spring中@Autowired注解的原理
  16. Qt开发经验小技巧196-200
  17. 《嵌入式 - 语音识别TWen-ASR-ONE开发笔记》第4章 TWen-ASR-ONE PWM调光
  18. QLabel的四种显示方式
  19. 怎么用python编写记事本_利用Python开发实现简单的记事本
  20. CS61B | Lecture10记录

热门文章

  1. python廖雪峰教程学习:Day 1
  2. 基于fluxion 6.9 钓鱼wifi
  3. MYSQL中coalesce函数的用法
  4. 检查mysql是否安装成功及环境变量配置
  5. 1分钟教你微商怎么利用视频引流,微商怎么在小视频引流呢?
  6. ​网站地图是什么?该如何生成详细介绍​
  7. python序列的切片的操作
  8. 阿里饶子昊:Spring Cloud Alibaba发展和近期规划
  9. im即时通讯开发:万人群聊消息
  10. m基于GA遗传优化算法的认知中继网络最优中继功率分配和最佳中继节点选择算法matlab仿真