1

我在 Mac OS X 上构建了一个动态库,一个 .dylib 文件,编译得很好。为了使用 .dylib 运行应用程序,名为 fips_premain.c 的文件中的一些函数在“main”之前运行,以检查指纹是否正确嵌入到 .dylib 中。在静态库的情况下,只需在静态库上运行名为 incore_macho 的可执行文件,指纹就会被检出。在动态库的情况下,当我让 xcode 在 dylib 上运行 incore_macho 时失败,输出如下:

/User/.../Debug/libcompute-osx.dylib is not a mach-o executable file (filetype 6 should be 2)

有什么想法吗?

4

2 回答 2

0

incore-macho 将仅在类型 2 文件上运行(即 MH_EXECUTE from ,换句话说,可执行文件)。类型 6 是 MH_DYLIB(您正在检查的动态库)。这就是错误消息所说的。据它说,它只是不适合 dylibs。

于 2013-06-12T06:50:53.130 回答
0

在静态库的情况下,只需在静态库上运行名为 incore_macho 的可执行文件,指纹就会被检出。

这并不完全正确。您不能将 FIPS 指纹嵌入到静态库中,因为代码和数据将在最终链接到可执行文件期间重新定位。您可以在可执行程序或共享对象中嵌入指纹,因为它们已经执行了最终链接。


在动态库的情况下,当我让 xcode 使用以下输出在 dylib 上运行 incore_macho 时出现故障

OpenSSL 基金会对此进行了修复。这是允许对 dylib 进行 incore 处理所需的更改。修改incore_macho.c如下:

第 530 行附近:

else if( !(header->filetype == MH_EXECUTE || header->filetype == MH_DYLIB) )
{
    fprintf(stderr, "%s is not a mach-o executable file "
        "(filetype %d, should be MH_EXECUTE or MH_DYLIB)\n",
        inFile->filename, header->filetype);
    return -1;
}

第 690 行附近:

else if( !(header->filetype == MH_EXECUTE || header->filetype == MH_DYLIB) )
{
    fprintf(stderr, "%s is not a mach-o executable file "
        "(filetype %d should be MH_EXECUTE or MH_DYLIB)\n",
        inFile->filename, header->filetype );
}

就是这样......任何你找到测试的地方MH_EXECUTE,也允许MH_DYLIB

或者,incore_macho.cGithub下载更新。他们的更新incore_macho.c还包括对 ARMv7 的支持。

于 2014-01-28T02:38:49.153 回答