]> git.saurik.com Git - ldid.git/blobdiff - ldid.cpp
Avoid sharing linkedit_data_commands in FAT files.
[ldid.git] / ldid.cpp
index 1795d344bc635f7a5f354e78733922dd7bce2829..e1fbda9b5412e3b9d077bfb98f674e5f0cb9da5a 100644 (file)
--- a/ldid.cpp
+++ b/ldid.cpp
@@ -31,6 +31,8 @@ extern "C" {
 #include <string>
 #include <vector>
 
+#include <plist/plist.h>
+
 struct fat_header {
     uint32_t magic;
     uint32_t nfat_arch;
@@ -728,12 +730,14 @@ struct CodesignAllocation {
     uint32_t offset_;
     uint32_t size_;
     uint32_t alloc_;
+    uint32_t align_;
 
-    CodesignAllocation(FatMachHeader mach_header, size_t offset, size_t size, size_t alloc) :
+    CodesignAllocation(FatMachHeader mach_header, size_t offset, size_t size, size_t alloc, size_t align) :
         mach_header_(mach_header),
         offset_(offset),
         size_(size),
-        alloc_(alloc)
+        alloc_(alloc),
+        align_(align)
     {
     }
 };
@@ -1006,8 +1010,11 @@ int main(int argc, const char *argv[]) {
                     size_t normal((size + 0x1000 - 1) / 0x1000);
                     alloc = Align(alloc + (special + normal) * 0x14, 16);
 
-                    offset = Align(offset, 4096);
-                    allocations.push_back(CodesignAllocation(mach_header, offset, size, alloc));
+                    auto *fat_arch(mach_header.GetFatArch());
+                    uint32_t align(fat_arch == NULL ? 0 : source.Swap(fat_arch->align));
+                    offset = Align(offset, 1 << align);
+
+                    allocations.push_back(CodesignAllocation(mach_header, offset, size, alloc, align));
                     offset += size + alloc;
                     offset = Align(offset, 16);
                 }
@@ -1041,7 +1048,7 @@ int main(int argc, const char *argv[]) {
                     fat_arch->cpusubtype = Swap(source->cpusubtype);
                     fat_arch->offset = Swap(allocation.offset_);
                     fat_arch->size = Swap(align + allocation.alloc_);
-                    fat_arch->align = Swap(0xc);
+                    fat_arch->align = Swap(allocation.align_);
                     ++fat_arch;
                 }
 
@@ -1087,9 +1094,11 @@ int main(int argc, const char *argv[]) {
             printf("path%zu='%s'\n", filei, file.c_str());
 
         FatHeader fat_header(Map(temp == NULL ? path : temp, !(flag_R || flag_T || flag_s || flag_S || flag_O || flag_D)));
-        struct linkedit_data_command *signature(NULL);
 
         _foreach (mach_header, fat_header.GetMachHeaders()) {
+            struct linkedit_data_command *signature(NULL);
+            struct encryption_info_command *encryption(NULL);
+
             if (flag_A) {
                 if (mach_header.GetCPUType() != flag_CPUType)
                     continue;
@@ -1136,6 +1145,8 @@ int main(int argc, const char *argv[]) {
                     load_command->cmd = mach_header.Swap(LC_LOAD_DYLIB);
                 else if (cmd == LC_CODE_SIGNATURE)
                     signature = reinterpret_cast<struct linkedit_data_command *>(load_command);
+                else if (cmd == LC_ENCRYPTION_INFO)
+                    encryption = reinterpret_cast<struct encryption_info_command *>(load_command);
                 else if (cmd == LC_UUID) {
                     volatile struct uuid_command *uuid_command(reinterpret_cast<struct uuid_command *>(load_command));
 
@@ -1165,18 +1176,20 @@ int main(int argc, const char *argv[]) {
 
                         dylib_command->dylib.timestamp = mach_header.Swap(timed);
                     }
-                } else if (cmd == LC_ENCRYPTION_INFO) {
-                    volatile struct encryption_info_command *encryption_info_command(reinterpret_cast<struct encryption_info_command *>(load_command));
+                }
+            }
 
-                    if (flag_D)
-                        encryption_info_command->cryptid = mach_header.Swap(0);
+            if (flag_d) {
+                _assert(encryption != NULL);
 
-                    if (flag_d) {
-                        printf("cryptoff=0x%x\n", mach_header.Swap(encryption_info_command->cryptoff));
-                        printf("cryptsize=0x%x\n", mach_header.Swap(encryption_info_command->cryptsize));
-                        printf("cryptid=0x%x\n", mach_header.Swap(encryption_info_command->cryptid));
-                    }
-                }
+                printf("cryptoff=0x%x\n", mach_header.Swap(encryption->cryptoff));
+                printf("cryptsize=0x%x\n", mach_header.Swap(encryption->cryptsize));
+                printf("cryptid=0x%x\n", mach_header.Swap(encryption->cryptid));
+            }
+
+            if (flag_D) {
+                _assert(encryption != NULL);
+                encryption->cryptid = mach_header.Swap(0);
             }
 
             if (flag_e) {