文章目录

  • dlfcn.h解析
    • - dlopen():打开一个动态链接库文件并返回一个句柄,该句柄用于后续的操作,如查找符号、关闭库等。
    • - dlsym():在打开的动态链接库中查找指定的符号,并返回符号的地址。
    • - dlclose():关闭先前打开的动态链接库。
    • - dlerror():返回最近一次动态链接库操作的错误信息。
    • - RTLD_LAZY 和 RTLD_NOW:这些是 dlopen() 函数的可选参数,分别表示懒加载和立即加载动态链接库中的符号。
    • - RTLD_GLOBAL 和 RTLD_LOCAL:这些也是 dlopen() 函数的可选参数,分别表示符号的全局可见性和局部可见性。
  • 附加
    • dlsym是什么缩写?
    • RTLD_LAZY 懒加载是什么?有什么利弊?
    • RTLD_NOW 立即加载是什么?
    • RTLD_GLOBAL是什么?(全局加载)
    • RTLD_LOCAL是什么?(本地加载、局部加载)(共享库和共享库之间不共享符号,避免符号混淆冲突)
    • 共享库(Shared Library)是什么?
    • 共享库的符号指的是什么?全局符号和局部符号
    • 云从加载共享库用的什么方案?
  • 代码示例:演示如何使用 dlopen()、dlsym()、dlclose()、dlerror() 函数来动态加载共享库,并使用懒加载和 RTLD_LOCAL 标志

dlfcn.h解析

“dlfcn.h” 是C语言中用于动态链接库操作的头文件。它定义了一些重要的函数和宏,其中最重要的函数有三个:

- dlopen():打开一个动态链接库文件并返回一个句柄,该句柄用于后续的操作,如查找符号、关闭库等。

- dlsym():在打开的动态链接库中查找指定的符号,并返回符号的地址。

- dlclose():关闭先前打开的动态链接库。

此外,还有一些其他的函数和宏,例如:

- dlerror():返回最近一次动态链接库操作的错误信息。

- RTLD_LAZY 和 RTLD_NOW:这些是 dlopen() 函数的可选参数,分别表示懒加载和立即加载动态链接库中的符号。

- RTLD_GLOBAL 和 RTLD_LOCAL:这些也是 dlopen() 函数的可选参数,分别表示符号的全局可见性和局部可见性。

这些函数和宏可以用于在运行时加载和卸载动态链接库,动态链接库的使用使得程序可以在运行时动态地加载和调用库函数,从而使得程序的可扩展性更强。

附加

dlsym是什么缩写?

“dlsym” 是 “Dynamic Linker Symbol” 的缩写。它是一个在 C 语言中用于动态加载库文件中的符号(函数、变量等)的函数。使用 dlsym() 函数,可以在运行时动态地查找和调用库中的符号,这样可以使得程序更加灵活和可扩展。

在 Unix-like 系统中,动态链接器在加载共享库时,会把库中的符号地址解析出来,并保存到一个符号表中。dlsym() 函数可以在这个符号表中查找符号的地址,并返回给调用方。因此,dlsym() 函数在实现动态链接时起到了关键的作用。

RTLD_LAZY 懒加载是什么?有什么利弊?

“RTLD_LAZY” 的缩写是 “Run-Time Loading with Lazy Binding”。这个标志告诉动态链接器在运行时懒惰地绑定符号引用,也就是在第一次使用符号时才加载并进行符号绑定。

在使用 RTLD_LAZY 标志打开共享库时,动态链接器将会在共享库中仅解析那些被直接使用的符号,而不会解析整个库的所有符号。这种延迟解析和绑定的方式可以提高程序的启动速度,因为共享库的大部分内容都不会被加载和解析,只有在需要使用的时候才会被加载。

需要注意的是,使用 RTLD_LAZY 标志可能会增加程序中未定义符号的数量,这可能会导致一些潜在的问题,如内存泄漏或者未定义的行为。因此,在使用 RTLD_LAZY 标志时需要谨慎,确保程序的正确性和稳定性。

RTLD_NOW 立即加载是什么?

“RTLD_NOW” 是 dlopen() 函数的一个标志,表示在运行时立即加载共享库中的所有符号,也称为"立即绑定"。使用 RTLD_NOW 标志打开共享库时,动态链接器会在加载共享库时就立即解析所有符号引用,并进行符号绑定。

与 RTLD_LAZY 不同,使用 RTLD_NOW 标志打开共享库时会立即加载和解析库中的所有符号,因此程序在启动时会花费更多的时间和内存资源。不过,这种方式可以避免使用延迟绑定时可能出现的一些问题,如懒加载导致的未定义符号等问题。

使用 RTLD_NOW 标志的另一个好处是,程序在运行时不需要再进行符号解析和绑定操作,因此可以提高程序的运行速度。在某些要求高性能的场景中,使用 RTLD_NOW 标志可能是一个不错的选择。

需要注意的是,使用 RTLD_NOW 标志打开共享库时可能会导致库之间的符号冲突或者版本不兼容等问题,因此在使用时需要进行谨慎评估和测试。

RTLD_GLOBAL是什么?(全局加载)

“RTLD_GLOBAL” 是 dlopen() 函数的一个标志,表示在打开共享库时将其中定义的符号全局可见,也就是说,共享库中的符号可以被后续打开的其他共享库所使用。使用 RTLD_GLOBAL 标志打开共享库时,共享库中定义的符号将会被添加到全局符号表中,以便其他共享库在后续加载时可以使用。

这种方式可以方便地实现共享库之间的符号共享,避免了多个共享库中出现相同符号定义而导致的符号冲突问题。在一些需要动态加载共享库且需要使用共享库中的符号的场景中,使用 RTLD_GLOBAL 标志可以方便地实现符号的共享和使用。

需要注意的是,使用 RTLD_GLOBAL 标志可能会带来一些安全风险,因为将共享库中的符号设置为全局可见可能会被滥用,导致安全漏洞的发生。因此,在使用 RTLD_GLOBAL 标志时需要进行谨慎评估和测试,确保程序的安全性和稳定性。

RTLD_LOCAL是什么?(本地加载、局部加载)(共享库和共享库之间不共享符号,避免符号混淆冲突)

“RTLD_LOCAL” 是 dlopen() 函数的一个标志,表示在打开共享库时将其中定义的符号限定为本地可见,也就是说,共享库中的符号只能被当前的共享库所使用。使用 RTLD_LOCAL 标志打开共享库时,共享库中定义的符号将只能在当前的共享库中使用,无法被其他共享库所使用。

这种方式可以避免共享库之间符号的冲突和混淆,提高程序的稳定性和可维护性。在一些需要使用共享库但是不需要共享符号的场景中,使用 RTLD_LOCAL 标志可以保证符号的隔离和独立性。

需要注意的是,使用 RTLD_LOCAL 标志可能会导致一些符号无法被正确解析和绑定,因为其他共享库无法使用当前共享库中的符号。因此,在使用 RTLD_LOCAL 标志时需要仔细评估程序的需求和共享库的依赖关系,确保符号的正确性和程序的稳定性。

共享库(Shared Library)是什么?

共享库(Shared Library),也叫动态库(Dynamic Library),是一种程序库的形式,可以在运行时动态加载到内存中,并被多个进程或程序共享使用。

与静态库不同,共享库在编译时并不会被链接到程序中,而是在程序运行时通过动态链接器动态加载到内存中,使程序可以调用共享库中的函数和使用共享库中的变量。共享库的一个重要特点是可以在多个程序中共享使用,这样可以节省系统内存,提高程序的性能和灵活性。

共享库一般是以动态链接库的形式存在,扩展名通常为.so(在类Unix系统中)或.dll(在Windows系统中),其内部的代码可以被多个进程或程序共享使用。使用共享库可以避免重复编写代码,降低程序的开发和维护成本。

需要注意的是,共享库在使用时需要注意版本兼容性和符号冲突等问题,以避免在程序运行时出现问题。

共享库的符号指的是什么?全局符号和局部符号

共享库中的符号是指共享库中的变量、函数、类等可供外部程序使用的标识符,它们可以通过符号名称在程序中进行调用和使用。共享库中的符号可以分为两类:全局符号和局部符号。

  • 全局符号是指在共享库中定义的可以被其他共享库和主程序使用的符号,这些符号在编译时会被加入到共享库的全局符号表中,并且可以通过 dlopen() 和 dlsym() 等函数在程序运行时动态加载和使用。全局符号可以通过设置 RTLD_GLOBAL 标志来使其在其他共享库中可见,以实现符号共享的目的。

  • 局部符号是指在共享库中定义的只能被本地共享库中的其他符号所使用的符号,这些符号在编译时不会被加入到全局符号表中,只能在本地共享库内部进行使用。局部符号可以通过设置 RTLD_LOCAL 标志来限制其在本地共享库中可见,以避免符号冲突和混淆的问题。

共享库中的符号是共享库在程序中的重要特性,可以通过符号名称和动态链接器实现程序的动态加载和运行时链接,提高程序的灵活性和可维护性。

云从加载共享库用的什么方案?


他们用的懒加载和本地加载(局部加载)的方式

代码示例:演示如何使用 dlopen()、dlsym()、dlclose()、dlerror() 函数来动态加载共享库,并使用懒加载和 RTLD_LOCAL 标志

下面是一个简单的 C++ 代码示例,演示了如何使用 dlopen()、dlsym()、dlclose()、dlerror() 函数来动态加载共享库,并使用懒加载和 RTLD_LOCAL 标志:

#include <iostream>
#include <dlfcn.h>int main() {// 使用 dlopen() 函数打开共享库 libtest.so,并以懒加载和 RTLD_LOCAL 标志打开void* handle = dlopen("./libtest.so", RTLD_LAZY | RTLD_LOCAL);if (!handle) {std::cerr << "Error loading shared library: " << dlerror() << std::endl;return 1;}// 使用 dlsym() 函数查找共享库中的函数 my_function,并将其转换为函数指针void (*my_function)() = (void (*)())dlsym(handle, "my_function");if (!my_function) {std::cerr << "Error loading symbol: " << dlerror() << std::endl;dlclose(handle);return 1;}// 调用共享库中的函数 my_function(*my_function)();// 使用 dlclose() 函数关闭共享库dlclose(handle);return 0;
}

这个示例代码打开名为 libtest.so 的共享库,然后使用 dlsym() 函数查找其中的 my_function 函数,并将其转换为函数指针。接着,程序通过函数指针调用共享库中的函数 my_function。最后,程序使用 dlclose() 函数关闭共享库。

在这个示例代码中,dlopen() 函数以 RTLD_LAZY | RTLD_LOCAL 标志打开共享库,表示使用懒加载和局部符号的方式打开共享库。这意味着共享库中的符号只能在当前共享库中使用,且在运行时才会被动态加载和解析。如果符号在共享库中未定义或者存在错误,可以通过 dlerror() 函数获得相应的错误信息。

Linux C++ libdl.so dlfcn.h使用方法(dlopen()、dlsym()、dlclose()、dlerror())(用于动态链接库操作)(懒加载、立即加载)共享库符号、动态库相关推荐

  1. LINUX下动态链接库的使用(dlopen/dlsym/dlclose/dlerror)

    dlopen 功能:打开一个动态链接库  包含头文件: #include <dlfcn.h>  函数定义: void * dlopen( const char * pathname, in ...

  2. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror

    dlopen 基本定义 功能:打开一个动态链接库  包含头文件:  #include <dlfcn.h>  函数定义:  void * dlopen( const char * pathn ...

  3. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror【zt】

    dlopen 基本定义 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, ...

  4. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

  5. Linux下静态库与动态库的引用关系深入分析

    很久就想写一篇关于动态库和静态库互相引用的一篇文章,但是总感觉准备不充分,而一直没有勇气下笔,最近在和同事的讨论中,似乎有了一些新的认识,想把这些记录下来,和大家进行一次分享,同时也是做一次记录. 这 ...

  6. Linux下的静态库、动态库和动态加载库

    from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...

  7. Linux下制作和使用静态库和动态库

    写在前面: ldd + 可执行文件 可以查看可执行文件所依赖的库 概述: Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib ...

  8. dlopen linux 实例_Linux静态库和动态库

    库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大 ...

  9. 【Linux】静态库与动态库的生成及调用

    一,库:一种可执行代码的二进制形式,可以被载入内存执行.其中库分为静态库.动态库 二,静态库和动态库的区别          1)Linux 下静态库:名字一般为 lib***.a利用静态函数库编译成 ...

最新文章

  1. CTF--base64编码过程中隐藏信息解密脚本
  2. antd upload手动上传_Flask上传文件
  3. 1gitolite构建git服务器
  4. 罗斯文2007(Northwind 2007)数据库、Access 2007 样列数据库分析[转]
  5. Java进阶之光!mysql安装包安装教程
  6. 查找两个字符串中相同字符串_使两个字符串相同的最低成本
  7. Divide by Zero 2018 and Codeforces Round #474 (Div. 1 + Div. 2, combined)
  8. 游泳,情人节纪念一下。
  9. 深度学习在图像语义分割中的应用
  10. 软件开发生命周期的四个阶段
  11. 汇编中的int 10h 与int 19h
  12. 如何衡量一篇英语作文词汇丰富度?
  13. 2012年8月26日
  14. pytorch进行图像识别_pytorch使用4种不同的模型进行面部表情识别
  15. app卡在启动页面android,app启动一直停留在启动页面
  16. 进击的 Vulkan 移动开发(一)之今生前世
  17. jcr多久更新一次_最新!2019年中科院分区表更新!!(附查询方法)
  18. 用python批量下载贴吧图片 附源代码
  19. Android Studio代理
  20. 企业级:基于语音卡呼叫中心系统 CTI语音服务器,电话排队系统,电话转接系统,电话录音系统

热门文章

  1. 低内存服务器LAMP的内存优化
  2. oracle通过load data 将数据导入表中通过存储过程进行批量处理
  3. 预告 · 5月26日IGS大会腾讯云游戏新文娱分论坛遇见TcaplusDB
  4. PTA乙级 1110 区块反转——25分
  5. 3d打印(4):解决打印一边好一边错位问题
  6. vshield manager的一些笔记
  7. 绩效考核管理系统使用说明3
  8. SCRM是一个怎样的项目?
  9. 勇猛的兔子的疯狂奔跑小游戏
  10. 微软MSDN订阅介绍