C osx下二进制文件的文件格式

C osx下二进制文件的文件格式,c,macos,mach-o,C,Macos,Mach O,我试图在osx 10.7.4下读取一些可执行文件的mach标题。在许多情况下,头部魔术字段不等于MH_magic,所以我猜这些二进制文件使用不同的格式?所以问题是MacOSX下的可执行文件使用什么文件格式 int main(int argc, char** argv) { char* path = getenv("PATH"); char* token = strtok(path, ":"); char filename[260]; DIR* pdir = NU

我试图在osx 10.7.4下读取一些可执行文件的
mach标题
。在许多情况下,头部魔术字段不等于
MH_magic
,所以我猜这些二进制文件使用不同的格式?所以问题是MacOSX下的可执行文件使用什么文件格式

 int main(int argc, char** argv) {
    char* path = getenv("PATH");
    char* token = strtok(path, ":");
    char filename[260];
    DIR* pdir = NULL;
    dirent* pentry = NULL;
    FILE* fin = NULL;
    mach_header header;
    // loop through each directory set in path
    while(token) {
       // try to open directory
       pdir = opendir(token);
       if(pdir) {
         // read entry from directory
         while((pentry = readdir(pdir))) {
            // check so it's a regular file
            if(pentry->d_type == DT_REG) {
               sprintf(filename, "%s/%s", token, pentry->d_name);
               // try to open file and read mach header
               fin = fopen(filename, "r");
               if(fin) { 
                  fread(&header, sizeof(header), 1, fin);   
                  if(header.magic == MH_MAGIC) {    
                     printf("%s has a mach-o header\n", filename);
                  }
                  fclose(fin);
               }
            }
         }
         closedir(pdir);
       }
       token = strtok(NULL, ":");
    }
    return 0;
  }

除了Mach-O二进制文件本身之外,还有Fat二进制文件,它们包含多个用于支持通用二进制文件的体系结构。它们有一个不同的魔法数字。据我所知,Mach-O中目前使用的魔法数字如下(来自我自己的代码):


您还需要注意字节交换的变体(
MH\u CIGAM
MH\u MAGIC
的字节交换对应物,
MH\u CIGAM\u 64
MH\u MAGIC\u 64
FAT\u CIGAM
FAT\u MAGIC
等)。这些常量都可以在下面的标题中找到
/usr/include/mach-o
const uint8_t magic1[4] = { 0xce, 0xfa, 0xed, 0xfe };   // 32-bit
const uint8_t magic2[4] = { 0xca, 0xfe, 0xba, 0xbe };   // Universal
const uint8_t magic3[4] = { 0xcf, 0xfa, 0xed, 0xfe };   // 64-bit