diff options
Diffstat (limited to 'contrib/gcc/crtstuff.c')
-rw-r--r-- | contrib/gcc/crtstuff.c | 85 |
1 files changed, 10 insertions, 75 deletions
diff --git a/contrib/gcc/crtstuff.c b/contrib/gcc/crtstuff.c index d3484e3..cdc447d 100644 --- a/contrib/gcc/crtstuff.c +++ b/contrib/gcc/crtstuff.c @@ -90,6 +90,11 @@ call_ ## FUNC (void) \ #if defined(EH_FRAME_SECTION_NAME) && !defined(USE_PT_GNU_EH_FRAME) # define USE_EH_FRAME_REGISTRY #endif +#if defined(EH_FRAME_SECTION_NAME) && defined(HAVE_LD_RO_RW_SECTION_MIXING) +# define EH_FRAME_SECTION_CONST const +#else +# define EH_FRAME_SECTION_CONST +#endif /* We do not want to add the weak attribute to the declarations of these routines in unwind-dw2-fde.h because that will cause the definition of @@ -126,8 +131,6 @@ extern void *__deregister_frame_info_bases (void *) /* Likewise for _Jv_RegisterClasses. */ extern void _Jv_RegisterClasses (void *) TARGET_ATTRIBUTE_WEAK; -#ifndef OBJECT_FORMAT_MACHO - #ifdef OBJECT_FORMAT_ELF /* Declare a pointer to void function type. */ @@ -187,13 +190,13 @@ STATIC func_ptr __DTOR_LIST__[1] = { (func_ptr) (-1) }; #endif /* __DTOR_LIST__ alternatives */ -#ifdef EH_FRAME_SECTION_NAME +#ifdef USE_EH_FRAME_REGISTRY /* Stick a label at the beginning of the frame unwind info so we can register and deregister it with the exception handling library code. */ -STATIC char __EH_FRAME_BEGIN__[] +STATIC EH_FRAME_SECTION_CONST char __EH_FRAME_BEGIN__[] __attribute__((section(EH_FRAME_SECTION_NAME), aligned(4))) = { }; -#endif /* EH_FRAME_SECTION_NAME */ +#endif /* USE_EH_FRAME_REGISTRY */ #ifdef JCR_SECTION_NAME /* Stick a label at the beginning of the java class registration info @@ -213,13 +216,9 @@ STATIC void *__JCR_LIST__[] in one DSO or the main program is not used in another object. The dynamic linker takes care of this. */ -/* XXX Ideally the following should be implemented using - __attribute__ ((__visibility__ ("hidden"))) - but the __attribute__ support is not yet there. */ #ifdef HAVE_GAS_HIDDEN -asm (".hidden\t__dso_handle"); +extern void *__dso_handle __attribute__ ((__visibility__ ("hidden"))); #endif - #ifdef CRTSTUFFS_O void *__dso_handle = &__dso_handle; #else @@ -459,7 +458,7 @@ STATIC func_ptr __DTOR_END__[1] #ifdef EH_FRAME_SECTION_NAME /* Terminate the frame unwind info section with a 4byte 0 as a sentinel; this would be the 'length' field in a real FDE. */ -STATIC int __FRAME_END__[] +STATIC EH_FRAME_SECTION_CONST int __FRAME_END__[] __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME), aligned(4))) = { 0 }; @@ -546,67 +545,3 @@ __do_global_ctors (void) #else /* ! CRT_BEGIN && ! CRT_END */ #error "One of CRT_BEGIN or CRT_END must be defined." #endif - -#else /* OBJECT_FORMAT_MACHO */ - -/* For Mach-O format executables, we assume that the system's runtime is - smart enough to handle constructors and destructors, but doesn't have - an init section (if it can't even handle constructors/destructors - you should be using INVOKE__main, not crtstuff). All we need to do - is install/deinstall the frame information for exceptions. We do this - by putting a constructor in crtbegin.o and a destructor in crtend.o. - - crtend.o also puts in the terminating zero in the frame information - segment. */ - -/* The crtstuff for other object formats use the symbol __EH_FRAME_BEGIN__ - to figure out the start of the exception frame, but here we use - getsectbynamefromheader to find this value. Either method would work, - but this method avoids creating any global symbols, which seems - cleaner. */ - -#include <mach-o/ldsyms.h> -extern const struct section * - getsectbynamefromheader (const struct mach_header *, - const char *, const char *); - -#ifdef CRT_BEGIN - -static void __reg_frame_ctor (void) __attribute__ ((constructor)); - -static void -__reg_frame_ctor (void) -{ - static struct object object; - const struct section *eh_frame; - - eh_frame = getsectbynamefromheader (&_mh_execute_header, - "__TEXT", "__eh_frame"); - __register_frame_info ((void *) eh_frame->addr, &object); -} - -#elif defined(CRT_END) - -static void __dereg_frame_dtor (void) __attribute__ ((destructor)); - -static void -__dereg_frame_dtor (void) -{ - const struct section *eh_frame; - - eh_frame = getsectbynamefromheader (&_mh_execute_header, - "__TEXT", "__eh_frame"); - __deregister_frame_info ((void *) eh_frame->addr); -} - -/* Terminate the frame section with a final zero. */ -STATIC int __FRAME_END__[] - __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME), - aligned(4))) - = { 0 }; - -#else /* ! CRT_BEGIN && ! CRT_END */ -#error "One of CRT_BEGIN or CRT_END must be defined." -#endif - -#endif /* OBJECT_FORMAT_MACHO */ |