gpt4 book ai didi

c - 防止 dlsym() 在 Mac OS X 上导入旧版 Sleep() 函数

转载 作者:行者123 更新时间:2023-11-30 15:30:08 25 4
gpt4 key购买 nike

虽然没有在任何地方记录或包含在头文件中,Mac OS X API 包含一个名为“Sleep”(注意大写字母“S”)的函数,该函数使整个计算机进入休眠状态。看这里: http://www.cocoabuilder.com/archive/xcode/247054-sleep-and-xcode.html

不幸的是,这个函数的名称与我的应用程序处理插件的方式冲突。我的插件是使用 dlopen() 加载的,然后使用 dlsym() 来查找各个函数。问题是我的插件 API 的设计方式是插件可能实现 Sleep() 函数,但这不是强制性的,即有些插件导出 Sleep() 函数,有些插件则导出 Sleep() 函数。不要导出 Sleep() 函数。

调用

ptr = dlsym(handle, "Sleep");

但是,在 Mac OS X 上总是会成功,因为如有必要,它将回退到 Mac OS X 旧版 API Sleep(),即,如果插件导出 Sleep() 函数,则上面的调用将返回正确的函数指针。但是,如果插件导出 Sleep() 函数,则 dlsym() 将返回指向 Mac OS X 旧版 API Sleep() 的指针,该指针会使整个计算机进入休眠状态,从而导致麻烦大了!

因此我想问一下是否有办法阻止 dlsym() 导入这个遗留函数。有没有办法告诉 dlsym() 仅查找在 -exported_symbols_list 编译器参数中传递的文件中显式声明的符号?即我正在构建这样的插件:

gcc -dynamiclib -exported_symbols_list plugin_symbols.txt -o test.dylib obj1.o ...

然后,我希望 dlsym() 只检查“plugin_symbols.txt”中指定的符号名称,并为“plugin_symbols.txt”中的所有名称返回 NULL。这是否可能以某种方式实现,或者您能想出另一种方法来阻止 dlsym() 导入旧版 Sleep() API 吗?

谢谢!

最佳答案

您是否尝试过将 RTLD_FIRST 与赋予 dlopen()mode 参数进行“或”运算?

关于c - 防止 dlsym() 在 Mac OS X 上导入旧版 Sleep() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25789248/

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