使用 dlsym 加载已命名的未导出符号?
是否可以使用 dlsym 从框架加载命名的未导出符号?
我尝试导入的符号有一个在框架内引用的名称。这是我需要调用的函数。
我正在尝试以通常的 dlopen + dlsym 方式执行此操作,但是当我尝试加载未导出的符号时,dlsym返回一个NULL指针。
Is it possible to load a named unexported symbol from a framework using dlsym
?
The symbol I'm trying to import has a name by which it is referred to within the framework. It is a function I need to call.
I'm trying to do it the usual dlopen
+ dlsym
way, but when I try to load a symbol that isn't exported, dlsym
returns a NULL pointer.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
dlsym
只能加载符号表中列出的函数。您可以通过在相关框架上运行nm
来列出符号表。您可以在 dyld 源中验证这一点:
ImageLoaderMachOClassic::findExportedSymbol
是 dlsym 的内部实现,它只是对符号表进行二分搜索:而
ImageLoaderMachO::parseLoadCmds
从 Mach 头中的加载命令加载符号表:dlsym
can only load functions that are listed in the symbol table. You can list the symbol table by runningnm
on the framework in question.You can verify this in the dyld source:
ImageLoaderMachOClassic::findExportedSymbol
is the internal implementation of dlsym, it simply binary searches the symbol table:And
ImageLoaderMachO::parseLoadCmds
loads the symbol table from the load commands in the Mach header: