【问题标题】:linux dlopen: can a library be "notified" when it is loaded?linux dlopen:加载时可以“通知”库吗?
【发布时间】:2010-12-08 19:30:38
【问题描述】:

有没有办法让共享库在加载时得到“通知”?

换句话说,假设我在共享库上使用 dlopen,是否有在共享库上自动调用(如果存在)的函数(例如 main?)

【问题讨论】:

    标签: linux dlopen shared-libraries


    【解决方案1】:

    库应导出初始化 和使用 gcc 的清理程序 __attribute__((constructor)) 和 __attribute__((destructor)) 函数属性。请参阅 gcc 信息页面 这些信息。构造函数 例程在 dlopen 之前执行 返回(或在 main() 开始之前 如果库在加载时加载 时间)。析构函数是 在 dlclose 返回之前执行(或 在 exit() 或 main() 完成之后 如果库在加载时加载 时间)。这些的 C 原型 功能是:

     void __attribute__ ((constructor))  my_init(void);  
     void __attribute__  ((destructor)) my_fini(void);
    

    取自http://tldp.org/HOWTO/Program-Library-HOWTO/index.html

    也就是说,您只需将 __attribute__ ((constructor)) 添加到要在加载共享库时调用的函数。上面的文档还指出,旧的 _ini 和 _fini 函数被认为是过时的。

    【讨论】:

    • 注意:非常不便携。
    【解决方案2】:

    是的。当打开一个库时,所有的静态构造都会发生......所以,如果你使用 C++,你可以这样做:

    // mylibrary.cpp 命名空间 { 类 dynamic_library_load_unload_handler { 民众: 动态库加载卸载处理程序(){ // 加载库时执行的代码 } ~dynamic_library_load_unload_handler(){ // 卸载库时执行的代码 } } dynamic_library_load_unload_handler_hook; }

    与给出的__attribute__ ((constructor)) 解决方案不同,这将是可移植的。但是请注意,如果您有多个这样的对象,则无法保证构造/销毁顺序。

    【讨论】:

    • 酷!有没有办法在ctor中获取argc和argv? Linux(ELF)具体解决方案:gcc.gnu.org/ml/gcc/2002-10/msg01296.html
    • @TrueY,我不熟悉便携式解决方案,但如果你找到了请告诉我。话虽如此,从 API 的角度来看,我建议库让应用程序确定哪些命令行开关配置什么...而不是尝试读取 argc/argv...考虑提供可以从文件加载配置的实用程序和/或者从库可以选择使用的命令行(但也为应用程序提供配置库行为的直接方法)。
    • 有趣。而在纯 C 语言中,您只能以这种方式使用构造函数(由函数调用初始化的全局变量),因为没有“静态反初始化”的概念。
    【解决方案3】:

    至少在 Linux 上,可能至少在其他一些 Unix 系统上,如果动态打开该库,则名为 _init 的全局函数(如果存在)将由动态链接器调用。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 2015-03-02
    • 2020-10-29
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多