X-Git-Url: https://git.saurik.com/ldid.git/blobdiff_plain/3cbc64635cba10e8333616e3bdceda4497658c10..ab113d2205a8e142ffccfe3b385877a7330009b9:/ldid.cpp diff --git a/ldid.cpp b/ldid.cpp index 5ee0675..ff9358d 100644 --- a/ldid.cpp +++ b/ldid.cpp @@ -1,5 +1,5 @@ -/* JocStrap - Java/Objective-C Bootstrap - * Copyright (C) 2007 Jay Freeman (saurik) +/* ldid - (Mach-O) Link-Loader Identity Editor + * Copyright (C) 2007-2010 Jay Freeman (saurik) */ /* @@ -68,11 +68,7 @@ struct fat_arch { struct mach_header { uint32_t magic; uint32_t cputype; - - // XXX: byte swapped? - uint16_t cpusubtype; - uint16_t caps; - + uint32_t cpusubtype; uint32_t filetype; uint32_t ncmds; uint32_t sizeofcmds; @@ -182,12 +178,14 @@ int32_t Swap_(int32_t value) { return Swap_(static_cast(value)); } +bool little_(true); + uint16_t Swap(uint16_t value) { - return true ? Swap_(value) : value; + return little_ ? Swap_(value) : value; } uint32_t Swap(uint32_t value) { - return true ? Swap_(value) : value; + return little_ ? Swap_(value) : value; } int16_t Swap(int16_t value) { @@ -296,6 +294,14 @@ class Framework { return size_; } + uint32_t GetCPUType() const { + return Swap(mach_header_->cputype); + } + + uint16_t GetCPUSubtype() const { + return Swap(mach_header_->cpusubtype) & 0xff; + } + std::vector GetLoadCommands() { std::vector load_commands; @@ -459,6 +465,13 @@ void sha1(uint8_t *hash, uint8_t *data, size_t size) { } int main(int argc, const char *argv[]) { + union { + uint16_t word; + uint8_t byte[2]; + } endian = {1}; + + little_ = endian.byte[0]; + bool flag_R(false); bool flag_t(false); bool flag_p(false); @@ -567,7 +580,7 @@ int main(int argc, const char *argv[]) { size_t size = _not(size_t); const char *arch; { Framework framework(path); - framework->flags |= MH_DYLDLINK; + framework->flags = framework.Swap(framework.Swap(framework->flags) | MH_DYLDLINK); _foreach (load_command, framework.GetLoadCommands()) { uint32_t cmd(framework.Swap((*load_command)->cmd)); @@ -582,24 +595,34 @@ int main(int argc, const char *argv[]) { if (size == _not(size_t)) size = framework.GetSize(); - switch (framework->cputype) { - case 7: switch (framework->cpusubtype) { + switch (framework.GetCPUType()) { + case 7: switch (framework.GetCPUSubtype()) { case 3: arch = "i386"; break; default: arch = NULL; break; } break; - case 12: switch (framework->cpusubtype) { + case 12: switch (framework.GetCPUSubtype()) { case 0: arch = "arm"; break; case 6: arch = "armv6"; break; case 9: arch = "armv7"; break; default: arch = NULL; break; } break; - case 16777223: switch (framework->cpusubtype) { + case 18: switch (framework.GetCPUSubtype()) { + case 10: arch = "ppc7400"; break; + default: arch = NULL; break; + } break; + + case 16777223: switch (framework.GetCPUSubtype()) { case 3: arch = "x86_64"; break; default: arch = NULL; break; } break; + case 16777234: switch (framework.GetCPUSubtype()) { + case 0: arch = "ppc64"; break; + default: arch = NULL; break; + } break; + default: arch = NULL; break; } }