gpt4 book ai didi

c - 处理共享对象中的全局变量

转载 作者:行者123 更新时间:2023-12-04 12:20:18 26 4
gpt4 key购买 nike

我在 global.c 文件中定义了一些全局变量,如下所示:

int globalvar;

我有一个头文件 global.h 将这个变量声明为 extern

extern int globalVar;

现在我有 main.c,它与已编译的 global.o(从 global.c 编译)链接,具有打开(使用 dlopen)共享对象 sh.so 的代码,它是从 sh.c 构建的,可以访问 globalVar,通过 global.h。虽然,我的可执行文件定义了 globalVar(静态链接),但当我加载动态链接库 sh.so 时,它显示未定义的 globalVar。如何处理?

最佳答案

Although, my executable has definition of globalVar (statically linked), when I load the dynamically linked library sh.so, it says undefined globalVar.

这是预料之中的。 ELF 二进制文件有两个 符号表:一个常规符号表和一个用于动态链接的符号表。您可以像这样检查它们:

 nm    a.out | grep globalVar  # expected: address D globalVar
nm -D a.out | grep globalVar # expected: no output

链接器不将 globalVar 放入动态符号表的原因是(在链接时)二进制文件之外的任何东西都不需要该符号。

How to handle this?

有几种方法。

  1. 如果您将-rdynamic 添加到您的链接行,您将要求链接器将每个 定义的符号导出到动态符号表中。虽然总的来说这是个坏主意,但这是解决您的问题的最快方法。
  2. 如果您使用 Gold 链接,您可以使用 -Wl,--export-dynamic-symbol=globalVar 仅导出 globalVar
  3. 您可以使用 -Wl,--dynamic-list=globals.txt 并将 globalVar 放入 globals.txt 文件中。
  4. 您可以使用-Wl,--dynamic-list-data 导出所有全局数据变量(这只比-rdynamic 稍微好一点)。

关于c - 处理共享对象中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43582165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com