gpt4 book ai didi

c - 如果我的进程没有定义变量但它被用作共享库中的外部变量,会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-03 23:43:10 25 4
gpt4 key购买 nike

我有 2 个进程 A 和 B。两个进程共享同一个名为 common_add.so 的共享对象文件

我在进程A中定义了变量g_test_variable

但是如果我没有在进程 B 中定义变量 g_test_variable 并使用 dlopen & dlsym 打开 common_add.so 文件并调用不使用 g_test_variable 变量的 add_double 函数,我会遇到任何问题吗?

/*
* File Name : common.c
* This file packaged as part of common_add.so
*/
extern int_32 g_test_variable; //declaration
int add_int(int a, int b)
{
if(g_test_variable)
printf("somthing");

return a+b;
}

double add_double(double a, double b)
{
return a-b;
}

最佳答案

(我说的是 Linux 系统)

所以你有一个程序aa(在进程A中运行)和一个程序bb(在进程B中运行)。两者都使用 common_add.so

但是如果aa 没有定义符号g_test_variable(在一些全局ELF 符号表中)它的dynamic linking common_add.so 会失败。

如何以及何时发生可能取决于动态链接是如何完成的。

如果您使用 dlopen(3)您最好传递 RTLD_NOW 以避免惰性链接。然后 dlopen 会失败并且 dlerror 会给出一个有用的信息。

如果您将默认的 RTLD_LAZY 传递给 dlopen,则错误可能仅在第一次调用 add_int 时触发,甚至显然不相关的 add_double(但细节可能因实现而异)

(不要忘记为 common_add.so 插件编译带有 -fPICcommon.c,并链接两个主要的 aabb 程序与 -rdynamic)

另见 this并阅读 Drepper 的 How To Write Shared Libraries纸。

我建议使用 RTLD_NOW 在早期 dlopen 时间捕获此类错误。当然,如果引用了 undefined symbol ,您不能指望程序能够运行! (所以你应该要求主程序定义g_test_variable ...)。您可以考虑将 g_test_variable 声明为 weak symbol在插件中(但我通常不推荐这样的技巧)。

关于c - 如果我的进程没有定义变量但它被用作共享库中的外部变量,会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40402330/

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