繁体   English   中英

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

[英]Prevent dlsym() from importing the legacy Sleep() function on Mac OS X

尽管Mac OS X API均未在任何地方记录或包含在头文件中,但它们包含一个名为“睡眠”(请注意大写字母“ S”)的函数,该函数使整个计算机进入睡眠状态。 参见此处: http : //www.cocoabuilder.com/archive/xcode/247054-sleep-and-xcode.html

不幸的是,该函数的名称与我的应用程序处理插件的方式冲突。 我的插件是使用dlopen()加载的,然后使用dlsym()查找单个函数。 问题是我的插件API的设计方式是插件可以实现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或ORing到给dlopen()mode参数中?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM