gpt4 book ai didi

c++ - 使用 NULL 句柄调用 dlsym() 不会返回 NULL,而是返回一个随机函数

转载 作者:IT王子 更新时间:2023-10-29 00:59:58 28 4
gpt4 key购买 nike

我的标题可能不太清楚,所以请允许我解释一下。我有一段代码是这样的:

void* pluginFile = dlopen(fileName, RTLD_LAZY);
auto function = dlsym(pluginFile, "ExpectedFunction");

如果 dlopen 返回正确的文件,这会正常工作。我的问题是 dlopen 找不到文件并返回 NULL。当前发生的是进行此调用:

dlsym(0x0, "ExpectedFunction");

问题是这会在我的项目中返回一个名为 ExpectedFunction 的随机函数。我认为 dlsym 会返回 NULL,因为传递的句柄是 NULL。我无法在线找到此类用例的预期行为。

我的问题是,当您将 NULL 句柄传递给 dlsym 时应该发生什么?它会简单地返回 NULL 还是会将其解释为位置 0x0 的句柄?如果预期行为是后者,那么我将简单地添加一个检查以确保 dlopen suceeded。如果不是,我想知道如果句柄为 NULL,为什么它会从其他库中随机返回一个具有相同名称的函数。

我当前的用例是我正在加载 10 个我创建的共享库,它们都有一个函数 ExpectedFunction()。但是,如果我们使用不存在的共享库的文件名调用 dlopen,它将返回 NULL。然后,dlsym 将返回一个指向最后加载的库的 ExpectedFunction() 的指针。

最佳答案

My question is, what is supposed to happen when you pass a NULL handle to dlsym?

规范说:

If handle does not refer to a valid object opened by dlopen() ... dlsym() shall return NULL.

但是,有一些保留的句柄值有特殊的行为。如果您传递此类保留句柄,则行为会有所不同。 POSIX 未指定确切的值,但例如在 glibc 中:

# define RTLD_NEXT        ((void *) -1l)
# define RTLD_DEFAULT ((void *) 0)

(void *) 0 为空,因此您不小心将 RTLD_DEFAULT 传递给了 dlsym。其中,规范说:

RTLD_DEFAULT

The symbol lookup happens in the normal global scope; that is, a search for a symbol using this handle would find the same definition as a direct use of this symbol in the program code.

因此,总而言之,应该发生什么取决于 NULL 是否为保留值。它恰好在glibc中保留,但在其他实现中不一定如此。

在传递给 dlsym 之前,您应该检查 dlopen 是否返回 null(或检查 dlerror 是否返回 null)。

关于c++ - 使用 NULL 句柄调用 dlsym() 不会返回 NULL,而是返回一个随机函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993565/

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