函数名 功能描述
dlopen 打开对象文件,使其可被程序访问
dlsym 获取执行了 dlopen 函数的对象文件中的函数的地址
dlerror 该函数没有参数,它会在发生前面的错误时返回一个字符串,同时将其从内存中清空; 在没有错误发生时返回 NULL,
dlclose

关闭目标文件。如果无需再调用共享对象的话,应用程序可以调用该方法来通知操作系统不再需要句柄和对象引用了。它完全是按引用来计数的,所以同一个共享对象的多个用户相互间不会发生冲突(只要还有一个用户在使用它,它就会待在内存中)。任何通过已关闭的对象的 dlsym 解析的符号都将不再可用

一、so库生成:

新建一个sort.c文件,写排序函数

使用gcc -o libsort.so -fPIC -shared sort.c产生libsort.so库。

fPIC :(Position Independent Code)地址无关代码,fPIC的作用

Linux位置无关代码实现,浅谈位置无关代码_weixin_39521520的博客-CSDN博客

void InsertSort(int* a,int len)
{int begin = 1;int i = 0;while(begin < len){int key = a[begin];for(i = begin-1;i>=0;i--){if(a[i]<=key){a[i+1] = key;break;}a[i+1] = a[i];}if(i<0)a[0] = key;begin++;}}

二、.so库有两种调用方法:

1.编译过程中连接到可执行程序,

2.用dlopen()动态加载

链接法

新建main.c文件:

使用命令gcc -o main main.c -lsort -L.编译。

  • -L. 表示.so库在当前目录下;
  • -lsort表示调用libsort.so库
    程序运行之前,要先使用命令export LD_LIBRARY_PATH=$(pwd),即.so库的路径添加到环境变量中,因为程序运行时会先加载所依赖的so库到内存中,so加载成功后才真正启动程序。
    运行./main后输出递增序列,调用成功。
#include <stdio.h>
int main()
{int i = 0;int test[]={1,3,5,7,2,4,6,8};InsertSort(test,8);for(i=0;i<8;i++){printf("%d,",test[i]);}printf("\n");return 0;
}

dlopen

新建main2.c文件:

使用命令gcc -o main2 main2.c -ldl编译。动态加载.so库的话需要-ldl。
运行./main2后输出递增序列,调用成功。

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main()
{int i = 0;int test[]={1,3,5,7,2,4,6,8};int (*sort)(int*,int);void *handle = dlopen("./libsort.so",RTLD_LAZY);if(!handle){printf("dlopen error :%s\n",dlerror());return -1;}sort = dlsym(handle,"InsertSort");if(!sort){printf("dlsym error :%s\n",dlerror());}sort(test,8);dlclose(handle);for(i=0;i<8;i++)printf("%d,",test[i]);printf("\n");return 0;
}

三、查看so库的符号表

readelf -s private.so
nm -D private.so

readelf nm objdump 命令详解

readelf nm objdump 命令详解_耿小渣的博客-CSDN博客_nm objdump

nm和readelf命令的区别 - foo__hack - 博客园

四、动态库(.so)隐藏函数名

向客户提供动态链接库(.so)时,有些关键的函数名不希望暴露出去,此时便可以通过gcc的-fvisibility=hidden选项对编译生成的so进行函数符号隐藏,如:LOCAL_CPPFLAGS +=-fvisibility=hidden,执行编译后,使用nm -D xxx.so命令或者readelf --symbols xxx.so查看函数名的确被隐藏,但此时是将所有函数名都隐藏了,那么客户加载so时需要调用的接口函数名(xxx)也会找不到定义,导致编译报undefined reference to xxx错误,所以需要暴露(导出)的函数前应该增加属性__attribute__ ((visibility("default")))设置成可见

五、GNU C++的符号改编机制

例如,全局函数int structure_func(int i, struct test s, double d),其经过符号改编后,函数名变成了_Z14structure_funci4testd

so库生成和用法汇总相关推荐

  1. 状态模式的介绍及状态机模型的函数库javascript-state-machine的用法和源码解析

    文章大体就两部分: 状态模式 状态机模型的函数库javascript-state-machine的用法和源码解析 场景及问题背景: 我们平时开发时本质上就是对应用程序的各种状态进行切换并作出相应处理. ...

  2. Gcc详解以及静态库、动态库生成

    [转] Gcc详解以及静态库.动态库生成 http://www.360doc.com/content/10/0619/14/1795182_33985297.shtml 1.gcc包含的c/c++编译 ...

  3. Python 中拼音库 PyPinyin 的用法,没错见名知意它就是用来翻译汉字的

    最近碰到了一个问题,项目中很多文件都是接手过来的中文命名的一些素材,结果在部署的时候文件名全都乱码了,导致项目无法正常运行. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基 ...

  4. python qrcode库生成二维码的代码

    如下内容内容是关于python qrcode库生成二维码的内容,希望能对各位有所用. import qrcode img = qrcode.make('Some data here')高级用法impo ...

  5. php table生成图片,php不用GD库生成当前时间的PNG格式图象的程序

    php不用GD库生成当前时间的PNG格式图象的程序 更新时间:2008年09月28日 14:40:24   作者: 该程序是不用GD库可以生成当前时间的PNG格式图象,给人大开眼界,很有参考价值. t ...

  6. <笔记2>numpy的生成随机数用法小记

    numpy的生成随机数用法小记 numpy生成随机数 <以下图片来自黑马程序猿录播课程笔记> import numpy as np import random #random 生产随机数 ...

  7. JSON简介以及用法汇总

    SON简介以及用法汇总 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation). JSON是一种轻量级的数据交换格式,某个JSON格式的文件内部譬如 ...

  8. Python爬虫入门(4):Urllib库的高级用法

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  9. python的numpy库的基本用法_python numpy库np.percentile用法说明

    在python中计算一个多维数组的任意百分比分位数,此处的百分位是从小到大排列,只需用np.percentile即可-- a = range(1,101) #求取a数列第90%分位的数值 np.per ...

  10. 五、Requests库详细的用法

    文章目录 Requests库介绍 Requests库安装 Requests库基本请求 get请求 post请求 自定义请求头部 设置超时时间 代理访问 重定向 ssl验证 获取响应信息 session ...

最新文章

  1. python代码根据时间获取周数(week of the year)
  2. 虚拟现实和元宇宙的最大短板在哪里?
  3. 海外观察丨6 大营销风向洞察,暗藏哪些机会?
  4. Android Broadcast广播机制分析
  5. 2020年人工智能领域突破性工作
  6. 5个令人震惊的统计数据证明日志不足
  7. review what i studied `date` - 2017-3-31
  8. UVA10917 Walk Through the Forest
  9. oracle两表,有什么方法对Oracle两张表的数据比较呢?
  10. 2014年3月份全国计算机等级考试二级c语言选择题大全,2014年3月全国计算机二级C选择题考试真题...
  11. 一元三次方程重根判别式_一元三次方程的判别式和求根公式是什么?
  12. C#小知识之中英文转换、去空格
  13. 轩小陌的Python笔记-Pandas 高级数据处理
  14. 操作系统:基本磁盘和动态磁盘
  15. 金融计算器,python实现
  16. POJ2248-Addition Chains-经典搜索题详解优化
  17. 窗口函数查询优化案例
  18. 哈工大LTP的依存分析
  19. 基于微信小程序的驾驶证模拟考试系统的设计与实现
  20. 2023,数字政务潮水已至

热门文章

  1. The APR based Apache Tomcat Native library which allows optimal performance in production environmen
  2. 解说微信抽奖大转盘小程序的开发过程以及一款抽奖大转盘活动软件!
  3. # 汉洛塔问题的解决思路及其代码
  4. PX Deq Credit: send blkd
  5. GNN从入门到精通 -- Graph Embedding (2)
  6. wei10-笔记本突然没有声音了!解决方法
  7. android天气api接口,[Android] 免费天气预报接口
  8. 闲鱼,越分享才越有价值
  9. open_table和opened_table的区别
  10. 教你用三种方式打造一款简单的网络播放器