-/* 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)
*/
/*
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;
return Swap_(static_cast<uint32_t>(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) {
return size_;
}
+ uint32_t GetCPUType() const {
+ return Swap(mach_header_->cputype);
+ }
+
+ uint16_t GetCPUSubtype() const {
+ return Swap(mach_header_->cpusubtype) & 0xff;
+ }
+
std::vector<struct load_command *> GetLoadCommands() {
std::vector<struct load_command *> load_commands;
}
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);
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));
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;
}
}