Loading...
mach_o/Policy.cpp dyld-1340 dyld-1235.2
--- dyld/dyld-1340/mach_o/Policy.cpp
+++ dyld/dyld-1235.2/mach_o/Policy.cpp
@@ -21,6 +21,7 @@
  * @APPLE_LICENSE_HEADER_END@
  */
 
+#include "Defines.h"
 #include "Error.h"
 #include "Platform.h"
 #include "Architecture.h"
@@ -37,18 +38,15 @@
 // MARK: --- Policy methods ---
 //
 
-Policy::Policy(Architecture arch, PlatformAndVersions pvs, uint32_t filetype, bool pathMayBeInSharedCache, bool kernel, bool staticExec)
+Policy::Policy(Architecture arch, PlatformAndVersions pvs, uint32_t filetype, bool pathMayBeInSharedCache, bool kernel)
  : _featureEpoch(pvs.platform.epoch(pvs.minOS)), _enforcementEpoch(pvs.platform.epoch(pvs.sdk)),
-   _arch(arch), _pvs(pvs), _filetype(filetype), _pathMayBeInSharedCache(pathMayBeInSharedCache), _kernel(kernel), _staticExec(staticExec)
+   _arch(arch), _pvs(pvs), _filetype(filetype), _pathMayBeInSharedCache(pathMayBeInSharedCache), _kernel(kernel)
 {
 }
 
 bool Policy::dyldLoadsOutput() const
 {
     if ( _kernel )
-        return false;
-
-    if ( _staticExec )
         return false;
 
     switch (_filetype) {
@@ -62,11 +60,6 @@
     return false;
 }
 
-bool Policy::isDynamicFirmware() const
-{
-    return dyldLoadsOutput() && (_pvs.platform == Platform::firmware);
-}
-
 bool Policy::kernelOrKext() const
 {
     if ( _kernel )
@@ -79,56 +72,32 @@
 {
     if ( _pvs.platform == Platform::bridgeOS )
         return Policy::mustUse;
-
-    // all arm64 variants are new and use LC_BUILD_VERSION
-    if ( _arch == Architecture::arm64 ) {
-        // except for pre-12.0 iOS and tvOS devices
-        if ( ((_pvs.platform == Platform::iOS) || (_pvs.platform == Platform::tvOS)) && (_featureEpoch < Platform::Epoch::fall2018) )
-            return Policy::mustNotUse;
+    return (_featureEpoch >= Platform::Epoch::fall2018) ? Policy::preferUse : Policy::mustNotUse;
+}
+
+Policy::Usage Policy::useDataConst() const
+{
+    if ( _pvs.platform == Platform::firmware )
+        return Policy::preferDontUse;
+    return (_featureEpoch >= Platform::Epoch::fall2019) ? Policy::preferUse : Policy::mustNotUse;
+}
+
+Policy::Usage Policy::useConstClassRefs() const
+{
+    return (_featureEpoch >= Platform::Epoch::spring2024) ? Policy::preferUse : Policy::mustNotUse;
+}
+
+Policy::Usage Policy::useGOTforClassRefs() const
+{
+    return (_featureEpoch >= Platform::Epoch::fall2024) ? Policy::preferUse : Policy::mustNotUse;
+}
+
+
+Policy::Usage Policy::useChainedFixups() const
+{
+    // arm64e kernel/kext use chained fixups
+    if ( kernelOrKext() && _arch.usesArm64AuthPointers() )
         return Policy::mustUse;
-    }
-
-    return (_featureEpoch >= Platform::Epoch::fall2018) ? Policy::preferUse : Policy::mustNotUse;
-}
-
-Policy::Usage Policy::useDataConst() const
-{
-    if ( !dyldLoadsOutput() )
-        return Policy::preferDontUse;
-
-    if ( _pvs.platform == Platform::firmware )
-        return Policy::preferDontUse;
-
-    return (_featureEpoch >= Platform::Epoch::fall2019) ? Policy::preferUse : Policy::mustNotUse;
-}
-
-Policy::Usage Policy::useConstClassRefs() const
-{
-    return (_featureEpoch >= Platform::Epoch::spring2024) ? Policy::preferUse : Policy::mustNotUse;
-}
-
-Policy::Usage Policy::useGOTforClassRefs() const
-{
-    return (_featureEpoch >= Platform::Epoch::fall2024) ? Policy::preferUse : Policy::mustNotUse;
-}
-
-Policy::Usage Policy::useConstInterpose() const
-{
-    if ( !dyldLoadsOutput() )
-        return Policy::preferDontUse;
-
-    return (_featureEpoch >= Platform::Epoch::fall2024) ? Policy::preferUse : Policy::mustNotUse;
-}
-
-Policy::Usage Policy::useChainedFixups() const
-{
-    if ( kernelOrKext() ) {
-        // arm64e kernel/kext use chained fixups
-        if ( _arch.usesArm64AuthPointers() )
-            return Policy::mustUse;
-        // arm64/x86 kernel/kexts use classic relocations
-        return Policy::mustNotUse;
-    }
 
     // firmware may use chained fixups, but has to opt-in
     if ( !dyldLoadsOutput() )
@@ -174,10 +143,6 @@
 uint16_t Policy::chainedFixupsFormat() const
 {
     if ( _arch.usesArm64AuthPointers() ) {
-        // rdar://142631843 (ld uses inconsistent chained fixup format for firmware 'dylibs')
-        if ( isDynamicFirmware() )
-            return DYLD_CHAINED_PTR_ARM64E_USERLAND24;
-
         if ( !dyldLoadsOutput() )
             return DYLD_CHAINED_PTR_ARM64E_KERNEL;
 
@@ -187,10 +152,6 @@
 
         return DYLD_CHAINED_PTR_ARM64E;
     } else if ( _arch.is64() ) {
-        // rdar://142631843 (ld uses inconsistent chained fixup format for firmware 'dylibs')
-        if ( isDynamicFirmware() )
-            return DYLD_CHAINED_PTR_64_OFFSET;
-
         if ( !dyldLoadsOutput() )
             return DYLD_CHAINED_PTR_64_OFFSET;
 
@@ -209,9 +170,6 @@
 {
     // opcode fixups introduced in macOS 10.6
     if ( _arch.usesx86_64Instructions() && (_pvs.platform == Platform::macOS) && (_pvs.minOS < Version32(10,6)) )
-        return Policy::mustNotUse;
-
-    if ( kernelOrKext() )
         return Policy::mustNotUse;
 
     // if not pre-macOS 10.6, then complement useChainedFixups()
@@ -288,17 +246,25 @@
 
 Policy::Usage Policy::useSourceVersionLoadCommand() const
 {
-    // objects/firmware don't use LC_SOURCE_VERSION
-    switch (_filetype) {
-        case MH_OBJECT:
-        case MH_PRELOAD:
-            return Policy::preferDontUse;
-        default:
-            break;
-    }
-
-    if ( _featureEpoch >= Platform::Epoch::fall2012 )
-        return Policy::preferUse;
+    // Only userland uses LC_SOURCE_VERSION
+    if ( !dyldLoadsOutput() )
+        return Policy::preferDontUse;
+
+    if ( _featureEpoch >= Platform::Epoch::fall2015 )
+        return Policy::preferUse;
+
+    return Policy::preferDontUse;
+}
+
+Policy::Usage Policy::useLegacyLinkedit() const
+{
+    if ( dyldLoadsOutput() ) {
+        // older releases didn't have a regular year-based version bump, so check the exact versions
+        if ( _pvs.platform == Platform::macOS && _pvs.minOS < Version32(10, 6) )
+            return Policy::mustUse;
+        if ( _pvs.platform == Platform::iOS && _pvs.minOS < Version32(3, 1) )
+            return Policy::mustUse;
+    }
 
     return Policy::preferDontUse;
 }
@@ -316,77 +282,11 @@
     return ( _featureEpoch >= Platform::Epoch::fall2024 );
 }
 
-bool Policy::useProtectedStack() const
-{
-    return false;
-}
-
-bool Policy::canUseEntryName() const
-{
-    if ( _pvs.platform == Platform::driverKit )
-        return false;
-
-    switch ( _filetype ) {
-        case MH_EXECUTE:
-        case MH_PRELOAD:
-        case MH_DYLINKER:
-            return true;
-        default:
-            return false;
-    }
-}
-
-Policy::Usage Policy::useEntryPointLoadCommand() const
-{
-    if ( _filetype != MH_EXECUTE )
-        return Policy::Usage::mustNotUse;
-
-    if ( _staticExec )
-        return Policy::Usage::mustNotUse;
-
-    if ( _pvs.platform == Platform::driverKit )
-        return Policy::Usage::mustNotUse;
-
-    if ( _arch.usesArm64Instructions() )
-        return Policy::Usage::mustUse;
-
-    return (_featureEpoch >= Platform::Epoch::fall2012 ? Policy::Usage::mustUse : Policy::Usage::mustNotUse);
-}
-
-bool Policy::keepDwarfUnwind() const
-{
-    if ( _staticExec )
-        return true;
-    if ( kernelOrKext() )
-        return true;
-
-    switch ( _filetype ) {
-        case MH_PRELOAD:
-        case MH_OBJECT:
-            return true;
-        default:
-            return (_featureEpoch < Platform::Epoch::fall2013);
-    }
-}
-
-bool Policy::canInferEmptySignedClassROs() const
-{
-    if ( !_arch.usesArm64AuthPointers() )
-        return false;
-
-    if ( !dyldLoadsOutput() )
-        return false;
-
-    return (_featureEpoch >= Platform::Epoch::fall2019);
-}
 
 // enforcements
 bool Policy::enforceReadOnlyLinkedit() const
 {
-    if ( _filetype == MH_EXECUTE )
-        return (_enforcementEpoch >= Platform::Epoch::fall2025);
-    else
-        return (_enforcementEpoch >= Platform::Epoch::fall2015);
+    return (_enforcementEpoch >= Platform::Epoch::fall2015);
 }
 
 bool Policy::enforceLinkeditContentAlignment() const
@@ -401,10 +301,7 @@
 
 bool Policy::enforceSegmentOrderMatchesLoadCmds() const
 {
-    if ( _filetype == MH_EXECUTE )
-        return (_enforcementEpoch >= Platform::Epoch::fall2025);
-    else
-        return (_enforcementEpoch >= Platform::Epoch::fall2019);
+    return (_enforcementEpoch >= Platform::Epoch::fall2019);
 }
 
 bool Policy::enforceTextSegmentPermissions() const
@@ -429,7 +326,7 @@
 
 bool Policy::enforceHasLinkedDylibs() const
 {
-    return (_enforcementEpoch >= Platform::Epoch::spring2025);
+    return (_enforcementEpoch >= Platform::Epoch::fall2021);
 }
 
 bool Policy::enforceInstallNamesAreRealPaths() const
@@ -439,15 +336,7 @@
 
 bool Policy::enforceHasUUID() const
 {
-    switch ( _filetype ) {
-        case MH_OBJECT:
-            return false;
-        case MH_EXECUTE:
-            // dyld main executable validation was not enabled until Fall 2025
-            return (_enforcementEpoch >= Platform::Epoch::fall2025);
-        default:
-            return (_enforcementEpoch >= Platform::Epoch::fall2021);
-    }
+    return (_filetype != MH_OBJECT) && (_enforcementEpoch >= Platform::Epoch::fall2021);
 }
 
 bool Policy::enforceMainFlagsCorrect() const
@@ -457,43 +346,22 @@
 
 bool Policy::enforceNoDuplicateDylibs() const
 {
-    return (_enforcementEpoch >= Platform::Epoch::fall2025);
+    return (_enforcementEpoch >= Platform::Epoch::fall2024);
 }
 
 bool Policy::enforceNoDuplicateRPaths() const
 {
-    return (_enforcementEpoch >= Platform::Epoch::fall2025);
+    return (_enforcementEpoch >= Platform::Epoch::fall2024);
 }
 
 bool Policy::enforceDataSegmentPermissions() const
-{
-    return (_enforcementEpoch >= Platform::Epoch::fall2025);
-}
-
-bool Policy::enforceDataConstSegmentPermissions() const
 {
     // dylibs in shared region don't set SG_READ_ONLY because of __objc_const
     if ( _pathMayBeInSharedCache )
         return false;
-    return (_enforcementEpoch >= Platform::Epoch::spring2025);
-}
-
-bool Policy::enforceImageListRemoveMainExecutable() const
-{
-    // Old simulators add the main executable to all_image_info in the simulator process, not in the host
-    return (_enforcementEpoch <= Platform::Epoch::fall2022);
-}
-
-bool Policy::enforceSetSimulatorSharedCachePath() const
-{
-    // Old simulators do not correctly fill out the private cache fields in the all_image_info, so do it for them
-    return (_enforcementEpoch <= Platform::Epoch::fall2021);
-}
-
-bool Policy::enforceUniqueSegmentNames() const
-{
-    return (_enforcementEpoch >= Platform::Epoch::fall2025);
-}
+    return (_enforcementEpoch >= Platform::Epoch::fall2023);
+}
+