Loading...
--- dyld/dyld-132.13/src/dyldInitialization.cpp
+++ dyld/dyld-97.1/src/dyldInitialization.cpp
@@ -1,6 +1,6 @@
/* -*- mode: C++; c-basic-offset: 4; tab-width: 4 -*-
*
- * Copyright (c) 2004-2008 Apple Inc. All rights reserved.
+ * Copyright (c) 2004-2005 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
@@ -45,11 +45,13 @@
#if __LP64__
+ #define macho_header mach_header_64
#define LC_SEGMENT_COMMAND LC_SEGMENT_64
#define macho_segment_command segment_command_64
#define macho_section section_64
#define RELOC_SIZE 3
#else
+ #define macho_header mach_header
#define LC_SEGMENT_COMMAND LC_SEGMENT
#define macho_segment_command segment_command
#define macho_section section
@@ -217,19 +219,13 @@
//
// re-map the main executable to a new random address
//
-static const struct macho_header* randomizeExecutableLoadAddress(const struct macho_header* orgMH, const char* envp[], uintptr_t* appsSlide)
+static const struct mach_header* randomizeExecutableLoadAddress(const struct mach_header* orgMH, uintptr_t* appsSlide)
{
#if __ppc__
// don't slide PIE programs running under rosetta
if ( dyld::isRosetta() )
return orgMH;
#endif
- // environment variable DYLD_NO_PIE can disable PIE
- for(const char** p = envp; *p != NULL; p++) {
- if ( strncmp(*p, "DYLD_NO_PIE=", 12) == 0 )
- return orgMH;
- }
-
// count segments
uint32_t segCount = 0;
const uint32_t cmd_count = orgMH->ncmds;
@@ -271,8 +267,6 @@
// choose a random new base address
#if __LP64__
uintptr_t highestAddressPossible = highestAddressUsed + 0x100000000ULL;
-#elif __arm__
- uintptr_t highestAddressPossible = 0x2fe00000;
#else
uintptr_t highestAddressPossible = 0x80000000;
#endif
@@ -293,13 +287,11 @@
for (uint32_t i = 0; i < segCount; ++i) {
uintptr_t newSegAddress = segs[i].vmaddr - lowestAddressUsed + newBaseAddress;
if ( (vm_copy(mach_task_self(), segs[i].vmaddr, segs[i].vmsize, newSegAddress) != KERN_SUCCESS)
- #if !__arm__ // work around for <rdar://problem/5736393>
|| (vm_protect(mach_task_self(), newSegAddress, segs[i].vmsize, true, segs[i].maxprot) != KERN_SUCCESS)
- #endif
|| (vm_protect(mach_task_self(), newSegAddress, segs[i].vmsize, false, segs[i].initprot) != KERN_SUCCESS) ) {
// can't copy so dealloc new region and run with original base address
vm_deallocate(mach_task_self(), newBaseAddress, sizeNeeded);
- dyld::warn("could not relocate position independent executable\n");
+ dyld::warn("could not relocate position independent exectable\n");
return orgMH;
}
}
@@ -308,7 +300,7 @@
// run with newly mapped executable
*appsSlide = newBaseAddress - lowestAddressUsed;
- return (const struct macho_header*)newBaseAddress;
+ return (const struct mach_header*)newBaseAddress;
}
// can't get new range, so don't slide to random address
@@ -335,7 +327,7 @@
// This is code to bootstrap dyld. This work in normally done for a program by dyld and crt.
// In dyld we have to do this manually.
//
-uintptr_t start(const struct macho_header* appsMachHeader, int argc, const char* argv[], intptr_t slide)
+uintptr_t start(const struct mach_header* appsMachHeader, int argc, const char* argv[], intptr_t slide)
{
// _mh_dylinker_header is magic symbol defined by static linker (ld), see <mach-o/ldsyms.h>
const struct macho_header* dyldsMachHeader = (const struct macho_header*)(((char*)&_mh_dylinker_header)+slide);
@@ -347,7 +339,11 @@
}
uintptr_t appsSlide = 0;
-
+
+ // set pthread keys to dyld range
+ __pthread_tsd_first = 1;
+ _pthread_keys_init();
+
// enable C++ exceptions to work inside dyld
dyld_exceptions_init(dyldsMachHeader, slide);
@@ -370,7 +366,7 @@
// if main executable was linked -pie, then randomize its load address
if ( appsMachHeader->flags & MH_PIE )
- appsMachHeader = randomizeExecutableLoadAddress(appsMachHeader, envp, &appsSlide);
+ appsMachHeader = randomizeExecutableLoadAddress(appsMachHeader, &appsSlide);
// now that we are done bootstrapping dyld, call dyld's main
return dyld::_main(appsMachHeader, appsSlide, argc, argv, envp, apple);