Self-modifying code on Darwin 10.15 resulting in “malformed mach-o image”?

前端 未结 2 2107
星月不相逢
星月不相逢 2020-12-11 05:18

I have a program that generates self-modifying code (see https://tigress.wtf/selfModify.html in case you\'re interested). It runs on x86 Darwin and Linux. On Darwin, I compi

2条回答
  •  情话喂你
    2020-12-11 05:42

    The problem you are observing is the restriction of macOS Catalina and not related to your compiler.

    Looking at the dyld source code (can be found here https://opensource.apple.com/release/macos-1015.html) the error message is coming from this code:

    if ( (segCmd->initprot & VM_PROT_WRITE) == VM_PROT_WRITE ) {
      if ( context.strictMachORequired )
        dyld::throwf("malformed mach-o image: %s segment maps start of file but is writable", segCmd->segname);
    }
    

    The exception is thrown only when strictMachORequired, which is always true on macOS 10.15 or higher, based on the other snippet from the dyld sources:

    #if __MAC_OS_X_VERSION_MIN_REQUIRED
      gLinkContext.strictMachORequired = false;
      //  be less strict about old macOS mach-o binaries
      ((dyld3::MachOFile*)mainExecutableMH)->forEachSupportedPlatform(^(dyld3::Platform platform, uint32_t minOS, uint32_t sdk) {
        if ( (platform == dyld3::Platform::macOS) && (sdk >= DYLD_PACKED_VERSION(10,15,0)) ) {
          gLinkContext.strictMachORequired = true;
        }
      });
      if ( gLinkContext.iOSonMac )
        gLinkContext.strictMachORequired = true;
    #else
      // simulators, iOS, tvOS, watchOS, are always strict
      gLinkContext.strictMachORequired = true;
    #endif
    

提交回复
热议问题