使用 dlopen 查找 dylib 版本
有没有办法使用 dylib 的路径查找其版本?我正在寻找接受与 dlopen 相同参数的东西。我查看了 NSVersionOfRunTimeLibrary,但从我阅读的文档来看,它似乎获取了当前 dylib 的版本,而不是路径中指定的版本。
谢谢
Is there a way to find the version of a dylib using its path? I am looking for something that accepts the same arguments as dlopen. I have looked at NSVersionOfRunTimeLibrary, but from my reading of the documentation it looks like it gets the version of the current dylib, not the one specified in the path.
Thank you
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在其上运行
otool -L
,它将显示其实际版本。我选择 libSystem.B,因为它在 10.4 和 10.5 SDK 中具有不同的版本:(参见第一个版本为 88.3.11,而第二个版本为 111.1.4)。此示例还表明,并非所有库都是指向其中包含版本号的文件的符号链接:
此处,文件的名称中没有版本号。
编辑:第二个解决方案是在测试程序中使用
NSVersionOfRunTimeLibrary
,在其中强制加载要检查的库。从以下 C 源代码创建一个程序libversion
:然后,您可以这样调用它:(
这里,版本号打印为十六进制,但您可以根据您的需要进行调整。)
Run
otool -L
on it, and it will show its actually version. I choose libSystem.B as it has different version in the 10.4 and 10.5 SDKs:(see how the first one has 88.3.11 version, while the second has 111.1.4). This example also shows that not all libraries are symbolic links to files with the version number in them:
Here, the files don't have the version number in their name.
EDIT: a second solution is to use
NSVersionOfRunTimeLibrary
in a test program, in which you force load the library you want to check. Create a programlibversion
from the following C source:Then, you call it like that:
(here, the version number is printed as hexadecimal, but you can adapt to your needs.)
您可以在这里查看 NSVersionOfRunTimeLibrary 的源代码:
http://www.opensource.apple.com/ source/dyld/dyld-132.13/src/dyldAPIsInLibSystem.cpp
在此基础上,您可以创建自己的版本,将
if(names_match(install_name, libraryName) == TRUE)
替换为if(strcmp(_dyld_get_image_name(i), 库名称) == 0)
这将解决原始版本期望库名称没有完整路径的问题,编辑后的版本期望完整路径,但它仍然会在加载的dylibs中搜索。
You can check the source code of NSVersionOfRunTimeLibrary here:
http://www.opensource.apple.com/source/dyld/dyld-132.13/src/dyldAPIsInLibSystem.cpp
Based on that you can create your own version which replaces
if(names_match(install_name, libraryName) == TRUE)
withif(strcmp(_dyld_get_image_name(i), libraryName) == 0)
That will fix the issue that the original expected the library name without full path, the edited version expects the full path, but it'll still search in the loaded dylibs.