Commit 29d2c7a5 by Richard Henderson Committed by Richard Henderson

crtstuff.c: Fix thinko last change.

        * crtstuff.c: Fix thinko last change.  Move list tails to start
        of CRT_END section.  Tidy ifdefs.
        (__EH_FRAME_BEGIN__): Always static for ELF.
        (__do_global_ctors_1): Rename from __frame_dummy.
        * config/mips/iris6.h (LINK_SPEC): Update for __do_global_ctors_1
        name change; don't hide __EH_FRAME_BEGIN__.

From-SVN: r45075
parent 3aed1981
2001-08-21 Richard Henderson <rth@redhat.com> 2001-08-21 Richard Henderson <rth@redhat.com>
* crtstuff.c: Fix thinko last change. Move list tails to start
of CRT_END section. Tidy ifdefs.
(__EH_FRAME_BEGIN__): Always static for ELF.
(__do_global_ctors_1): Rename from __frame_dummy.
* config/mips/iris6.h (LINK_SPEC): Update for __do_global_ctors_1
name change; don't hide __EH_FRAME_BEGIN__.
2001-08-21 Richard Henderson <rth@redhat.com>
* gdbinit.in: Move break on exit after break on fancy_abort. * gdbinit.in: Move break on exit after break on fancy_abort.
* config/ia64/ia64.c (ia64_return_in_memory): True for variable * config/ia64/ia64.c (ia64_return_in_memory): True for variable
......
...@@ -505,6 +505,6 @@ do { \ ...@@ -505,6 +505,6 @@ do { \
%{call_shared} %{no_archive} %{exact_version} %{w} \ %{call_shared} %{no_archive} %{exact_version} %{w} \
%{!shared: %{!non_shared: %{!call_shared: -call_shared -no_unresolved}}} \ %{!shared: %{!non_shared: %{!call_shared: -call_shared -no_unresolved}}} \
%{rpath} -init __do_global_ctors -fini __do_global_dtors \ %{rpath} -init __do_global_ctors -fini __do_global_dtors \
%{shared:-hidden_symbol __do_global_ctors,__do_global_dtors,__EH_FRAME_BEGIN__,__frame_dummy} \ %{shared:-hidden_symbol __do_global_ctors,__do_global_ctors_1,__do_global_dtors} \
-_SYSTYPE_SVR4 -woff 131 \ -_SYSTYPE_SVR4 -woff 131 \
%{mabi=32: -32}%{mabi=n32: -n32}%{mabi=64: -64}%{!mabi*: -n32}" %{mabi=32: -32}%{mabi=n32: -n32}%{mabi=64: -64}%{!mabi*: -n32}"
...@@ -119,8 +119,6 @@ typedef void (*func_ptr) (void); ...@@ -119,8 +119,6 @@ typedef void (*func_ptr) (void);
#ifdef CRT_BEGIN #ifdef CRT_BEGIN
#ifdef INIT_SECTION_ASM_OP
/* NOTE: In order to be able to support SVR4 shared libraries, we arrange /* NOTE: In order to be able to support SVR4 shared libraries, we arrange
to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__, to have one set of symbols { __CTOR_LIST__, __DTOR_LIST__, __CTOR_END__,
__DTOR_END__ } per root executable and also one set of these symbols __DTOR_END__ } per root executable and also one set of these symbols
...@@ -167,10 +165,7 @@ STATIC func_ptr __DTOR_LIST__[1] ...@@ -167,10 +165,7 @@ STATIC func_ptr __DTOR_LIST__[1]
#ifdef EH_FRAME_SECTION_NAME #ifdef EH_FRAME_SECTION_NAME
/* Stick a label at the beginning of the frame unwind info so we can register /* Stick a label at the beginning of the frame unwind info so we can register
and deregister it with the exception handling library code. */ and deregister it with the exception handling library code. */
#ifdef INIT_SECTION_ASM_OP STATIC char __EH_FRAME_BEGIN__[]
STATIC
#endif
char __EH_FRAME_BEGIN__[]
__attribute__((section(EH_FRAME_SECTION_NAME), aligned(4))) __attribute__((section(EH_FRAME_SECTION_NAME), aligned(4)))
= { }; = { };
#endif /* EH_FRAME_SECTION_NAME */ #endif /* EH_FRAME_SECTION_NAME */
...@@ -178,12 +173,13 @@ char __EH_FRAME_BEGIN__[] ...@@ -178,12 +173,13 @@ char __EH_FRAME_BEGIN__[]
#ifdef JCR_SECTION_NAME #ifdef JCR_SECTION_NAME
/* Stick a label at the beginning of the java class registration info /* Stick a label at the beginning of the java class registration info
so we can register them properly. */ so we can register them properly. */
STATIC void *__JCR_LIST__[] STATIC void *__JCR_LIST__[]
__attribute__ ((unused, section(JCR_SECTION_NAME), aligned(sizeof(void*)))) __attribute__ ((unused, section(JCR_SECTION_NAME), aligned(sizeof(void*))))
= { }; = { };
#endif /* JCR_SECTION_NAME */ #endif /* JCR_SECTION_NAME */
#ifdef INIT_SECTION_ASM_OP
#ifdef OBJECT_FORMAT_ELF #ifdef OBJECT_FORMAT_ELF
/* Declare the __dso_handle variable. It should have a unique value /* Declare the __dso_handle variable. It should have a unique value
...@@ -338,12 +334,11 @@ static void __do_global_ctors_aux (void); ...@@ -338,12 +334,11 @@ static void __do_global_ctors_aux (void);
void void
__do_global_ctors (void) __do_global_ctors (void)
{ {
#ifdef INVOKE__main /* If __main won't actually call __do_global_ctors #ifdef INVOKE__main
then it doesn't matter what's inside the function. /* If __main won't actually call __do_global_ctors then it doesn't matter
The inside of __do_global_ctors_aux is called what's inside the function. The inside of __do_global_ctors_aux is
automatically in that case. called automatically in that case. And the Alliant fx2800 linker
And the Alliant fx2800 linker crashes crashes on this reference. So prevent the crash. */
on this reference. So prevent the crash. */
__do_global_ctors_aux (); __do_global_ctors_aux ();
#endif #endif
} }
...@@ -378,9 +373,8 @@ __do_global_ctors_aux (void) /* prologue goes in .init section */ ...@@ -378,9 +373,8 @@ __do_global_ctors_aux (void) /* prologue goes in .init section */
#endif /* OBJECT_FORMAT_ELF */ #endif /* OBJECT_FORMAT_ELF */
#else /* INIT_SECTION_ASM_OP */ #elif defined(HAS_INIT_SECTION) /* ! INIT_SECTION_ASM_OP */
#ifdef HAS_INIT_SECTION
/* This case is used by the Irix 6 port, which supports named sections but /* This case is used by the Irix 6 port, which supports named sections but
not an SVR4-style .fini section. __do_global_dtors can be non-static not an SVR4-style .fini section. __do_global_dtors can be non-static
in this case because we protect it with -hidden_symbol. */ in this case because we protect it with -hidden_symbol. */
...@@ -399,11 +393,12 @@ __do_global_dtors (void) ...@@ -399,11 +393,12 @@ __do_global_dtors (void)
} }
#if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME) #if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME)
/* Define a function here to call __register_frame. crtend.o is linked in /* A helper function for __do_global_ctors, which is in crtend.o. Here
after libgcc.a, and hence can't call libgcc.a functions directly. That in crtbegin.o, we can reference a couple of symbols not visible there.
can lead to unresolved function references. */ Plus, since we're before libgcc.a, we have no problems referencing
functions from there. */
void void
__frame_dummy (void) __do_global_ctors_1(void)
{ {
#ifdef EH_FRAME_SECTION_NAME #ifdef EH_FRAME_SECTION_NAME
static struct object object; static struct object object;
...@@ -417,17 +412,68 @@ __frame_dummy (void) ...@@ -417,17 +412,68 @@ __frame_dummy (void)
} }
#endif /* EH_FRAME_SECTION_NAME || JCR_SECTION_NAME */ #endif /* EH_FRAME_SECTION_NAME || JCR_SECTION_NAME */
#endif /* HAS_INIT_SECTION */ #else /* ! INIT_SECTION_ASM_OP && ! HAS_INIT_SECTION */
#endif /* INIT_SECTION_ASM_OP */ #error "What are you doing with crtstuff.c, then?"
#endif /* defined(CRT_BEGIN) */ #endif
#elif defined(CRT_END) /* ! CRT_BEGIN */
/* Put a word containing zero at the end of each of our two lists of function
addresses. Note that the words defined here go into the .ctors and .dtors
sections of the crtend.o file, and since that file is always linked in
last, these words naturally end up at the very ends of the two lists
contained in these two sections. */
#ifdef CTOR_LIST_END
CTOR_LIST_END;
#elif defined(CTORS_SECTION_ASM_OP)
/* Hack: force cc1 to switch to .data section early, so that assembling
__CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
asm (CTORS_SECTION_ASM_OP);
STATIC func_ptr __CTOR_END__[1]
__attribute__((aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#else
STATIC func_ptr __CTOR_END__[1]
__attribute__((section(".ctors"), aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#endif
#ifdef DTOR_LIST_END
DTOR_LIST_END;
#elif defined(DTORS_SECTION_ASM_OP)
asm (DTORS_SECTION_ASM_OP);
STATIC func_ptr __DTOR_END__[1]
__attribute__ ((unused, aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#else
STATIC func_ptr __DTOR_END__[1]
__attribute__((unused, section(".dtors"), aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#endif
#ifdef CRT_END #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__[]
__attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME),
aligned(4)))
= { 0 };
#endif /* EH_FRAME_SECTION */
#ifdef JCR_SECTION_NAME
/* Null terminate the .jcr section array. */
STATIC void *__JCR_END__[1]
__attribute__ ((unused, section(JCR_SECTION_NAME),
aligned(sizeof(void *))))
= { 0 };
#endif /* JCR_SECTION_NAME */
#ifdef INIT_SECTION_ASM_OP #ifdef INIT_SECTION_ASM_OP
#ifdef OBJECT_FORMAT_ELF #ifdef OBJECT_FORMAT_ELF
static func_ptr __CTOR_END__[];
static void static void
__do_global_ctors_aux (void) __do_global_ctors_aux (void)
{ {
...@@ -491,86 +537,31 @@ asm (TEXT_SECTION_ASM_OP); ...@@ -491,86 +537,31 @@ asm (TEXT_SECTION_ASM_OP);
#endif /* OBJECT_FORMAT_ELF */ #endif /* OBJECT_FORMAT_ELF */
#else /* defined(INIT_SECTION_ASM_OP) */ #elif defined(HAS_INIT_SECTION) /* ! INIT_SECTION_ASM_OP */
#ifdef HAS_INIT_SECTION
/* This case is used by the Irix 6 port, which supports named sections but /* This case is used by the Irix 6 port, which supports named sections but
not an SVR4-style .init section. __do_global_ctors can be non-static not an SVR4-style .init section. __do_global_ctors can be non-static
in this case because we protect it with -hidden_symbol. */ in this case because we protect it with -hidden_symbol. */
static func_ptr __CTOR_END__[]; extern void __do_global_ctors_1(void);
extern void __frame_dummy (void);
void void
__do_global_ctors (void) __do_global_ctors (void)
{ {
func_ptr *p; func_ptr *p;
#if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME) #if defined(EH_FRAME_SECTION_NAME) || defined(JCR_SECTION_NAME)
__frame_dummy (); __do_global_ctors_1();
#endif #endif
for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--) for (p = __CTOR_END__ - 1; *p != (func_ptr) -1; p--)
(*p) (); (*p) ();
} }
#endif
#endif /* defined(INIT_SECTION_ASM_OP) */
/* Put a word containing zero at the end of each of our two lists of function
addresses. Note that the words defined here go into the .ctors and .dtors
sections of the crtend.o file, and since that file is always linked in
last, these words naturally end up at the very ends of the two lists
contained in these two sections. */
#ifdef CTOR_LIST_END #else /* ! INIT_SECTION_ASM_OP && ! HAS_INIT_SECTION */
CTOR_LIST_END; #error "What are you doing with crtstuff.c, then?"
#elif defined(CTORS_SECTION_ASM_OP)
/* Hack: force cc1 to switch to .data section early, so that assembling
__CTOR_LIST__ does not undo our behind-the-back change to .ctors. */
static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
asm (CTORS_SECTION_ASM_OP);
STATIC func_ptr __CTOR_END__[1]
__attribute__((aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#else
STATIC func_ptr __CTOR_END__[1]
__attribute__((section(".ctors"), aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#endif #endif
#ifdef DTOR_LIST_END #else /* ! CRT_BEGIN && ! CRT_END */
DTOR_LIST_END; #error "One of CRT_BEGIN or CRT_END must be defined."
#elif defined(DTORS_SECTION_ASM_OP)
asm (DTORS_SECTION_ASM_OP);
STATIC func_ptr __DTOR_END__[1]
__attribute__ ((unused, aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#else
STATIC func_ptr __DTOR_END__[1]
__attribute__((unused, section(".dtors"), aligned(sizeof(func_ptr))))
= { (func_ptr) 0 };
#endif #endif
#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__[]
__attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME),
aligned(4)))
= { 0 };
#endif /* EH_FRAME_SECTION */
#ifdef JCR_SECTION_NAME
/* Stick a label at the beginning of the java class registration info
so we can register them properly. */
STATIC void *__JCR_END__[1]
__attribute__ ((unused, section(JCR_SECTION_NAME),
aligned(sizeof(func_ptr))))
= { 0 };
#endif /* JCR_SECTION_NAME */
#endif /* defined(CRT_END) */
#else /* OBJECT_FORMAT_MACHO */ #else /* OBJECT_FORMAT_MACHO */
/* For Mach-O format executables, we assume that the system's runtime is /* For Mach-O format executables, we assume that the system's runtime is
...@@ -609,9 +600,7 @@ __reg_frame_ctor (void) ...@@ -609,9 +600,7 @@ __reg_frame_ctor (void)
__register_frame_info ((void *) eh_frame->addr, &object); __register_frame_info ((void *) eh_frame->addr, &object);
} }
#endif /* CRT_BEGIN */ #elif defined(CRT_END)
#ifdef CRT_END
static void __dereg_frame_dtor (void) __attribute__ ((destructor)); static void __dereg_frame_dtor (void) __attribute__ ((destructor));
...@@ -630,6 +619,9 @@ STATIC int __FRAME_END__[] ...@@ -630,6 +619,9 @@ STATIC int __FRAME_END__[]
__attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME), __attribute__ ((unused, mode(SI), section(EH_FRAME_SECTION_NAME),
aligned(4))) aligned(4)))
= { 0 }; = { 0 };
#endif /* CRT_END */
#else /* ! CRT_BEGIN && ! CRT_END */
#error "One of CRT_BEGIN or CRT_END must be defined."
#endif
#endif /* OBJECT_FORMAT_MACHO */ #endif /* OBJECT_FORMAT_MACHO */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment