Loading...
--- 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);
+}
+