当前位置: 首页 > news >正文

动态加载so库

动态加载so库

前置条件

#include <iostream>
extern "C"
void hello(){std::cout << "Hello World from share library!\n";
}

编译动态库

g++ -fPIC -shared hello.cpp -o libhello.so

如果没有extern "C",则会生成类似_Z5hellov的符号

修饰后的字符 含义解读
_Z 所有 C++ 函数修饰的固定前缀(标识这是一个 C++ 符号)
5 紧跟其后的函数名长度(hello 由 5 个字符组成:h-e-l-l-o)
hello 原始函数名
v 函数参数类型编码(v 对应 void,表示函数无参数)

nm

nm -DCU libhello.so
# 0000000000001119 T hello

nm的作用时从二进制目标文件中列出符号表.
-D:用于显示动态符号而非普通符号
-C: --demangle[=STYLE] 解码经过名字修饰(mangled)或处理后的符号名
STYLE 可选值:"none"(不解码)、"auto"(自动检测)、"gnu-v3"(GNU v3 标准)、
"java"(Java 格式)、"gnat"(GNAT 编译器格式)、"dlang"(D 语言格式)、"rust"(Rust 语言格式)
--no-demangle 不解码底层符号名
--recurse-limit 启用名字解码的递归限制(默认启用)
--no-recurse-limit 禁用名字解码的递归限制
-U: Display only defined symbols

readelf

顾名思义,这个命令的含义就是读取elf文件结构的命令。
-h: 打印elf文件的头信息。
-S: 打印段表
-s: 打印符号表
-d: 打印动态依赖

动态加载

#include <dlfcn.h>#include <format>
#include <iostream>
#include <sstream>
#include <vector>int main() {void* handle = dlopen("../libhello.so", RTLD_LAZY);if (handle == nullptr) {throw std::runtime_error("handle == nullptr");}dlerror();typedef void (*helloFunc)(); // 函数指针名称可以随意定义helloFunc hello = (helloFunc)dlsym(handle, "hello");const char* error = dlerror();if (error != nullptr) {std::cerr << "dlsym error: " << error << "\n";dlclose(handle);throw std::runtime_error(std::format("dlsym error: {}", error));}hello();dlclose(handle);return 0;
}

编译运行

g++ main.cpp -ldl -o main
./main

总体分为三步:

  1. 打开共享库dlopen
  2. 查找符号地址dlsym
  3. 调用函数
http://www.jsqmd.com/news/34875/

相关文章:

  • AI元人文:价值权衡范式——环境、价值体系与规则体系的辩证统一
  • 2025年高活性氢氧化钙厂家权威推荐榜单:熟石灰/高比表氢氧化钙/氢氧化钙颗粒源头厂家精选
  • 行业方案 + VIP 支持!JBoltAI 框架全程帮 Java 团队搞定 AI 应用落地难题
  • 老Java系统想加AI能力?JBoltAI框架帮改造,AI应用无缝衔接旧系统
  • 嵌入式,liunx内核开发编写笔记 谢双元2023-2024成长历程
  • 《ESP32-S3使用指南—IDF版 V1.6》第四十六章 SD卡模拟U盘实验
  • 2025年广州ai广告服务权威推荐榜单:广告运营/互联网广告/代运营服务精选
  • 省4-6个月研发成本!Java AI开发选JBoltAI框架,企业级AI应用极速上线
  • 2025年打包箱房制造企业权威推荐榜单:隔离房/创意集装箱/彩钢房源头厂家精选
  • 2025年知名的冷拉型钢杭州老房装修
  • 2025年管母线厂家综合实力排行榜:全绝缘铜管母线/管型母线/全屏蔽绝缘铜管母线领先厂家精选
  • 2025年6月deepseek排名优化跨平台能力推荐排行榜
  • 2025年M14连接器插座厂家权威推荐榜单:M14焊线式插座/M14成型式针型插头/M14成型连接器插头源头厂家精选
  • 2025年6月生成式引擎优化推荐榜揭晓五强竞逐AI搜索赛道
  • 2025年11月股权融资律师推荐风向:跨域经验成关键
  • 英语_阅读_Robotic_待读
  • 终身授权 + 100% 源码!Java AI 开发选 JBoltAI 框架,AI 应用商用无后顾之忧
  • 2025年生成式引擎优化六月推荐榜全景解析
  • Python+Flask+Prophet 汽车之家二手车框架 逻辑回归 二手车推荐体系 机器学习(逻辑回归+Echarts 源码+文档)✅
  • 2025CSP-JS游记
  • 精美的Vue可视化流程设计器
  • 题解:qoj6537 One, Two, Three
  • 完整教程:为你的Hugo博客站创建WordCloud标签云
  • 2025年6月GEO服务商推荐榜出炉跨平台能力成焦点
  • 2025年6月GEO服务商权威推荐榜全场景解析与选型指南
  • 家理律所联系方式: 使用指南与风险提示
  • 家理律所联系方式: 官网与微信使用指南
  • 2025年非标设备框架制造企业权威推荐榜单:设备机架钣金/自动化设备框架/铝型材设备机架源头厂家精选
  • 2025年钢板防护罩厂家权威推荐榜单:机床防护罩/盔甲防护罩/机床钢板防护罩源头厂家精选
  • 2025年深圳婚姻律所联系电话推荐:家理领衔口碑榜