Loading...
--- Libc/Libc-1725.40.4/sys/crt_externs.c
+++ Libc/Libc-498/sys/crt_externs.c
@@ -29,15 +29,37 @@
#if defined(__DYNAMIC__)
#include "mach-o/dyld.h" /* defines _dyld_lookup_and_bind() */
+#define STRINGIFY(a) # a
#define DECLARE_VAR(var, type) \
static type * var ## _pointer = 0
#define DECLARE_PROGNAME(var, type) \
static type * var ## _pointer = 0; \
- __unused static type _priv_ ## var = 0
+ static type _priv_ ## var = 0
+#define SETUP_VAR(var) \
+ if ( var ## _pointer == 0) { \
+ _dyld_lookup_and_bind( STRINGIFY(_ ## var), \
+ (unsigned long *) & var ## _pointer, 0); \
+ }
+#define SETUP_PROGNAME(var) \
+ if ( var ## _pointer == 0) { \
+ if(NSIsSymbolNameDefined( STRINGIFY(_ ## var) )) \
+ _dyld_lookup_and_bind( STRINGIFY(_ ## var), \
+ (unsigned long *) & var ## _pointer, 0); \
+ else { \
+ char *progname = _dyld_get_image_name(0); \
+ if(_priv_ ## var = strrchr(progname, '/')) \
+ _priv_ ## var ++; \
+ else \
+ _priv_ ## var = progname; \
+ var ## _pointer = & _priv_ ## var; \
+ } \
+ }
#define USE_VAR(var) (var ## _pointer)
#else
#define DECLARE_VAR(var, type) extern type var
#define DECLARE_PROGNAME(var, type) DECLARE_VAR(var, type)
+#define SETUP_VAR(var)
+#define SETUP_PROGNAME(var) SETUP_VAR(var)
#define USE_VAR(var) (& var)
#endif
@@ -48,22 +70,27 @@
DECLARE_PROGNAME(__progname, char *);
char ***_NSGetArgv(void) {
+ SETUP_VAR(NXArgv);
return(USE_VAR(NXArgv));
}
int *_NSGetArgc(void) {
+ SETUP_VAR(NXArgc);
return(USE_VAR(NXArgc));
}
char ***_NSGetEnviron(void) {
+ SETUP_VAR(environ);
return(USE_VAR(environ));
}
char **_NSGetProgname(void) {
+ SETUP_PROGNAME(__progname);
return(USE_VAR(__progname));
}
struct mach_header *_NSGetMachExecuteHeader(void) {
+ SETUP_VAR(_mh_execute_header);
return(USE_VAR(_mh_execute_header));
}
@@ -77,24 +104,17 @@
char** __prognamePtr;
};
-
-#define SUPPORT_PRE_GM_10_5_EXECUTABLES (__ppc__ || __i386__)
-
-
/*
- * dyld calls libSystem_initializer() and passes it a ProgramVars struct
- * containing pointers to the main executable's NXArg* global variables.
- * libSystem_initializer() calls _libc_initializer() which calls
+ * dyld calls libSystem_initializer() and passes it a ProgramVars struct containing pointers to the
+ * main executable's NXArg* global variables. libSystem_initializer() calls __libc_init() which calls
* _program_vars_init() passing the ProgramVars parameter.
*/
void __attribute__((visibility("hidden")))
_program_vars_init(const struct ProgramVars* vars) {
-#if SUPPORT_PRE_GM_10_5_EXECUTABLES
// to support transitional 10.5 main executables that don't have extended __dyld section and instead call _NSSetProgramVars,
// don't overwrite values set by _NSSetProgramVars()
if ( NXArgv_pointer != NULL )
return;
-#endif
NXArgv_pointer = vars->NXArgvPtr;
NXArgc_pointer = vars->NXArgcPtr;
environ_pointer = vars->environPtr;
@@ -102,7 +122,6 @@
_mh_execute_header_pointer = vars->mh;
}
-#if SUPPORT_PRE_GM_10_5_EXECUTABLES
/*
* This is only called by main executables built with pre 10-5 GM crt1.10.5.o. In those programs,
* there is no extended __dyld section, dyld cannot tell _program_vars_init() where the real program
@@ -115,10 +134,8 @@
__progname_pointer = crt_progname;
_mh_execute_header_pointer = crt_mh;
}
-#endif
-#endif /* __DYNAMIC__ */
+#endif
-#if __ppc__
/*
* Fix for Radar bug 2200596 --
* EH symbol definitions for gcc 2.7.2.x implementation of
@@ -148,5 +165,3 @@
/* This is what egcs uses for its global data pointer */
void *__eh_global_dataptr = (void *)0;
-#endif /* __ppc__ */
-