/* Specialized bits of code needed to support construction and
destruction of file-scope objects in C++ code.
- Copyright (C) 1991, 1994-1999, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998,
+ 1999, 2000, 2001 Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@monkeys.com).
This file is part of GNU CC.
the Free Software Foundation; either version 2, or (at your option)
any later version.
+In addition to the permissions in the GNU General Public License, the
+Free Software Foundation gives you unlimited permission to link the
+compiled version of this file into combinations with other programs,
+and to distribute those combinations without any restriction coming
+from the use of this file. (The General Public License restrictions
+do apply in other respects; for example, they cover modification of
+the file, and distribution when not linked into a combine
+executable.)
+
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
-/* As a special exception, if you link this library with files
- compiled with GCC to produce an executable, this does not cause
- the resulting executable to be covered by the GNU General Public License.
- This exception does not however invalidate any other reasons why
- the executable file might be covered by the GNU General Public License. */
-
/* This file is a bit like libgcc1.c/libgcc2.c in that it is compiled
multiple times and yields multiple .o files.
compiled for the target, and hence definitions concerning only the host
do not apply. */
+#include "auto-host.h"
#include "tm.h"
#include "tsystem.h"
-#include "defaults.h"
#include "frame.h"
+#ifndef CRT_CALL_STATIC_FUNCTION
+# define CRT_CALL_STATIC_FUNCTION(func) func ()
+#endif
+
/* We do not want to add the weak attribute to the declarations of these
routines in frame.h because that will cause the definition of these
symbols to be weak as well.
an additional check that you are doing everything right. But if you do
use the `-z text' option when building a shared library, you will get
errors unless the .ctors and .dtors sections are marked as writable
- via the SHF_WRITE attribute.) */
+ via the SHF_WRITE attribute.)
+
+ These defaults do not include leading spacing, as they will only be
+ used in asm:s here. */
#ifndef CTORS_SECTION_ASM_OP
#define CTORS_SECTION_ASM_OP ".section\t.ctors,\"aw\""
#ifdef OBJECT_FORMAT_ELF
/* Declare the __dso_handle variable. It should have a unique value
- in every shared-object; in a main program its value is zero. */
+ in every shared-object; in a main program its value is zero. The
+ object should in any case be protected. This means the instance
+ 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");
+#endif
#ifdef CRTSTUFFS_O
void *__dso_handle = &__dso_handle;
fini_dummy (void)
{
asm (FINI_SECTION_ASM_OP);
- __do_global_dtors_aux ();
+ CRT_CALL_STATIC_FUNCTION (__do_global_dtors_aux);
#ifdef FORCE_FINI_SECTION_ALIGN
FORCE_FINI_SECTION_ALIGN;
#endif
init_dummy (void)
{
asm (INIT_SECTION_ASM_OP);
- frame_dummy ();
+ CRT_CALL_STATIC_FUNCTION (frame_dummy);
#ifdef FORCE_INIT_SECTION_ALIGN
FORCE_INIT_SECTION_ALIGN;
#endif
INVOKE__main is defined. This has the additional effect of forcing cc1
to switch to the .text section. */
-static void __do_global_ctors_aux ();
+static void __do_global_ctors_aux (void);
void
__do_global_ctors (void)
{
#endif /* defined(INIT_SECTION_ASM_OP) */
/* Force cc1 to switch to .data section. */
-static func_ptr force_to_data[0] __attribute__ ((__unused__)) = { };
+static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
/* 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__,
init_dummy (void)
{
asm (INIT_SECTION_ASM_OP);
- __do_global_ctors_aux ();
+ CRT_CALL_STATIC_FUNCTION (__do_global_ctors_aux);
#ifdef FORCE_INIT_SECTION_ALIGN
FORCE_INIT_SECTION_ALIGN;
#endif
#endif /* defined(INIT_SECTION_ASM_OP) */
/* Force cc1 to switch to .data section. */
-static func_ptr force_to_data[0] __attribute__ ((__unused__)) = { };
+static func_ptr force_to_data[1] __attribute__ ((__unused__)) = { };
/* 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
#ifdef CRT_BEGIN
-static void __reg_frame_ctor () __attribute__ ((constructor));
+static void __reg_frame_ctor (void) __attribute__ ((constructor));
static void
__reg_frame_ctor (void)
#ifdef CRT_END
-static void __dereg_frame_dtor () __attribute__ ((destructor));
+static void __dereg_frame_dtor (void) __attribute__ ((destructor));
-static
-void
+static void
__dereg_frame_dtor (void)
{
const struct section *eh_frame;
/* Terminate the frame section with a final zero. */
/* Force cc1 to switch to .data section. */
-static void * force_to_data[0] __attribute__ ((__unused__)) = { };
+static void * force_to_data[1] __attribute__ ((__unused__)) = { };
typedef unsigned int ui32 __attribute__ ((mode (SI)));
asm (EH_FRAME_SECTION_ASM_OP);