【问题标题】:Checking type of variables in dynamically loaded shared libraries in C/C++在 C/C++ 中检查动态加载的共享库中的变量类型
【发布时间】:2013-05-06 15:47:20
【问题描述】:

我正在开发一个 C 库的测试环境。该库广泛使用全局变量,我想在测试代码中检查。不幸的是,我必须动态加载库(使用 libdl)才能重置函数静态变量。这样,我必须使用 dlsym() 加载每个全局变量,并且必须手动将它们一个一个地转换为正确的类型。有什么方法可以自动化并以某种方式获取变量的类型信息? 据我所知,libdl 没有这样的功能。我想知道我是否可以链接到 gdb,使用它来访问共享库全局变量,但我也没有找到任何关于这种可能性的线索。

【问题讨论】:

    标签: c gdb shared-libraries dlopen


    【解决方案1】:

    不,没有办法获得某些dlsym-ed 符号的类型,因为ELF 共享对象不(总是)携带任何类型信息(C++ 除外,使用name mangling)。

    原则上,ELF 共享对象可能在没有任何 C 编译器的情况下生成,因此给定符号的类型概念可能不存在,或者类型与 C 约定不兼容。

    但是,您可以将自己限制为包含调试信息的共享库。 DWARF 格式确实携带有关符号的类型(甚至源位置)信息。您可以使用例如解析它libdwarf 或其他一些库。

    您可以考虑其他方式:例如,您可以拥有自己的 GCC 插件或 MELT 扩展名(MELT 是一种扩展 GCC 的特定领域语言),它们将在编译(使用 GCC)共享库时使用,并且会在某处注册类型信息。

    【讨论】:

    • 库确实是用 gcc 和调试信息编译的。我看到有一个用于读取 DWARF 信息的库。这可能是一个很好的起点。谢谢你的线索。
    • 最后我使用了 gcc 的 typeof() 扩展。
    • 标题中可用的信息。
    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多