2013-01-16 120 views
1

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

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; 
    } 

回答

2

除了Mach-O的二进制文件本身有脂肪二进制含有可被用来支持通用二进制多个架构。这些具有不同的幻数。至于我可以跟以下幻数是目前在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 
+2

您还需要注意的byteswapped变种('MH_CIGAM'是的byteswapped对口'MH_MAGIC','MH_MAGIC_64'的'MH_CIGAM_64','FAT_MAGIC'的FAT_CIGAM等等)。这些常量都可以在'/ usr/include/mach-o'下的头文件中找到。 – bdash