gpt4 book ai didi

objective-c - 如何获取目录中的dylib版本信息

转载 作者:行者123 更新时间:2023-12-03 17:13:18 26 4
gpt4 key购买 nike

我想获得 dylib 版本。我有一个 dylib 路径,我想获取其版本号。我尝试过“otool -L”命令,它给了我正确的输出,但根据要求我无法使用它,因为我想要的目录中有 100 个 dylib获取版本信息,我无法通过 NSTask 和 NSPipe 为每个 dylib 运行“otool”命令。

我还找到了 NSVersionOfLinkTimeLibrary() 函数来获取 dylib 版本,但根据文档 NSVersionOfLinkTimeLibrary 返回链接库的版本号,而不是其他库的版本号dylib。

对此的任何帮助都会有所帮助。

谢谢。奥姆卡

最佳答案

我通过编写自己的 dylib 解析器解决了这个问题。下面是代码片段

- (int64_t)getDylibVersion :(NSString *)dylibPth
{
const char* strFilePath = [dylibPth UTF8String];

FILE* fileHandle = fopen(strFilePath, "rb");

struct mach_header mh;
if(fileHandle)
{
size_t bytesRead = fread(&mh, 1, sizeof(mh), fileHandle);

if(bytesRead == sizeof(mh))
{
if((mh.magic == MH_MAGIC_64 || mh.magic == MH_MAGIC) && mh.filetype == MH_DYLIB)
{
for(int j = 0; j < mh.ncmds; j++)
{
union
{
struct load_command lc;
struct dylib_command dc;
} load_command;
if (sizeof(load_command.lc) != fread(&load_command.lc, 1, sizeof(load_command.lc), fileHandle))
goto fail;

switch (load_command.lc.cmd)
{
case LC_SEGMENT:
break;
case LC_UUID:
break;
case LC_DYLD_INFO_ONLY:
break;
case LC_SYMTAB:
break;
case LC_LOAD_DYLIB:
break;
case LC_ID_DYLIB:
{
if (sizeof(load_command) - sizeof(load_command.lc) != fread(&load_command.lc + 1, 1, sizeof(load_command) - sizeof(load_command.lc), dylib_handle))
goto fail;
fclose(fileHandle);
return(load_command.dc.dylib.current_version);
}

default:
break;
}

if (0 != fseek(fileHandle, load_command.lc.cmdsize - sizeof(load_command.lc), SEEK_CUR))
goto fail;
}
}
}
}

fail:
fclose(fileHandle);

return (-1);
}

请注意,Mach-O dylib 版本号被编码为 32 位无符号整数,主要版本位于高 16 位,次要版本位于位 8 到 15,补丁级别位于低 8 位:

uint32_t version = …;
uint32_t major = version >> 16;
uint32_t minor = (version >> 8) & 0xff;
uint32_t revision = version & 0xff;

另请注意,上述代码仅适用于“精简”二进制文件。 “胖”多架构二进制文件以胖 header 开始,您需要首先协商该 header 以找到适合您所需架构的切片。此外,上述仅适用于运行架构的字节顺序的架构。

关于objective-c - 如何获取目录中的dylib版本信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14777523/

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