2012-04-12 5 views
5

मैक पर UUID पाने के लिए मैं उपयोग कर सकते हैंएक चल रही प्रक्रिया के mach-o uuid कैसे प्राप्त करें?

dwarfdump -u path/to/compile/executable 

भी मैं 'बाइनरी छवियाँ' अनुभाग

रास्ता iOS डिवाइस पर दुर्घटना के बिना UUID प्राप्त करने के लिए है में साधारण दुर्घटना साथ UUID मिल सकता है?

उत्तर

12

एक निष्पादन योग्य (mach-o फ़ाइल) UUID लिंकर ld द्वारा बनाया गया है और इसे LC_UUID नामक लोड कमांड में संग्रहीत किया जाता है। आप एक मच-ओ फ़ाइल otool का उपयोग कर के सभी लोड आदेशों देख सकते हैं:

otool -l path_to_executable 

> ... 
> Load command 8 
>  cmd LC_UUID 
> cmdsize 24 
>  uuid 3AB82BF6-8F53-39A0-BE2D-D5AEA84D8BA6 
> ... 

किसी भी प्रक्रिया एक वैश्विक प्रतीक _mh_execute_header नामित का उपयोग कर अपने मच-ओ हैडर पहुँच सकते हैं। इस प्रतीक का उपयोग करके आप लोड कमांड पर LC_UUID खोज सकते हैं। कमांड का पेलोड यूयूआईडी है:

#import <mach-o/ldsyms.h> 

NSString *executableUUID() 
{ 
    const uint8_t *command = (const uint8_t *)(&_mh_execute_header + 1); 
    for (uint32_t idx = 0; idx < _mh_execute_header.ncmds; ++idx) { 
     if (((const struct load_command *)command)->cmd == LC_UUID) { 
      command += sizeof(struct load_command); 
      return [NSString stringWithFormat:@"%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X", 
        command[0], command[1], command[2], command[3], 
        command[4], command[5], 
        command[6], command[7], 
        command[8], command[9], 
        command[10], command[11], command[12], command[13], command[14], command[15]]; 
     } else { 
      command += ((const struct load_command *)command)->cmdsize; 
     } 
    } 
    return nil; 
} 
संबंधित मुद्दे