diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2005-01-07 21:04:39 +0300 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2005-01-07 21:04:39 +0300 |
commit | f7a74742e69119d7133c8d9619ae94175faed068 (patch) | |
tree | 526a24a1f892045b2e52bec5a0ee8ba743ee32be /newlib/libc | |
parent | 35310094a18515e7b0be818abbff262f6718f849 (diff) |
2005-01-07 Paul Brook <paul@codesourcery.com>
* configure.in: Add test for .init_array.
* configure: Regenerate.
* newlib.hin: Add HAVE_INITFINI_ARRAY.
* libc/misc/Makefile.am: Add init.c
* libc/misc/Makefile.in: Regenerate.
* libc/misc/init.c: New file.
* libc/sys/arm/crt0.S: Call __libc_{init,fini}_array instead of
_init/_fini if they exist.
Diffstat (limited to 'newlib/libc')
-rw-r--r-- | newlib/libc/misc/Makefile.am | 2 | ||||
-rw-r--r-- | newlib/libc/misc/Makefile.in | 7 | ||||
-rw-r--r-- | newlib/libc/misc/init.c | 60 | ||||
-rw-r--r-- | newlib/libc/sys/arm/crt0.S | 6 |
4 files changed, 71 insertions, 4 deletions
diff --git a/newlib/libc/misc/Makefile.am b/newlib/libc/misc/Makefile.am index e5ed00b17..fa3a8ce6d 100644 --- a/newlib/libc/misc/Makefile.am +++ b/newlib/libc/misc/Makefile.am @@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) -LIB_SOURCES = dprintf.c unctrl.c ffs.c +LIB_SOURCES = dprintf.c unctrl.c ffs.c init.c libmisc_la_LDFLAGS = -Xcompiler -nostdlib diff --git a/newlib/libc/misc/Makefile.in b/newlib/libc/misc/Makefile.in index 72376f7a9..22301b80c 100644 --- a/newlib/libc/misc/Makefile.in +++ b/newlib/libc/misc/Makefile.in @@ -110,7 +110,7 @@ AUTOMAKE_OPTIONS = cygnus INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS) -LIB_SOURCES = dprintf.c unctrl.c ffs.c +LIB_SOURCES = dprintf.c unctrl.c ffs.c init.c libmisc_la_LDFLAGS = -Xcompiler -nostdlib @@ -140,11 +140,12 @@ CPPFLAGS = @CPPFLAGS@ LIBS = @LIBS@ lib_a_LIBADD = @USE_LIBTOOL_FALSE@lib_a_OBJECTS = dprintf.$(OBJEXT) unctrl.$(OBJEXT) \ -@USE_LIBTOOL_FALSE@ffs.$(OBJEXT) +@USE_LIBTOOL_FALSE@ffs.$(OBJEXT) init.$(OBJEXT) LTLIBRARIES = $(noinst_LTLIBRARIES) libmisc_la_LIBADD = -@USE_LIBTOOL_TRUE@libmisc_la_OBJECTS = dprintf.lo unctrl.lo ffs.lo +@USE_LIBTOOL_TRUE@libmisc_la_OBJECTS = dprintf.lo unctrl.lo ffs.lo \ +@USE_LIBTOOL_TRUE@init.lo CFLAGS = @CFLAGS@ COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) diff --git a/newlib/libc/misc/init.c b/newlib/libc/misc/init.c new file mode 100644 index 000000000..539fbefed --- /dev/null +++ b/newlib/libc/misc/init.c @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2004 CodeSourcery, LLC + * + * Permission to use, copy, modify, and distribute this file + * for any purpose is hereby granted without fee, provided that + * the above copyright notice and this notice appears in all + * copies. + * + * This file is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* Handle ELF .{pre_init,init,fini}_array sections. */ +#include <sys/types.h> + +#ifdef HAVE_INITFINI_ARRAY + +/* These magic symbols are provided by the linker. */ +extern void (*__preinit_array_start []) (void) __attribute__((weak)); +extern void (*__preinit_array_end []) (void) __attribute__((weak)); +extern void (*__init_array_start []) (void) __attribute__((weak)); +extern void (*__init_array_end []) (void) __attribute__((weak)); +extern void (*__fini_array_start []) (void) __attribute__((weak)); +extern void (*__fini_array_end []) (void) __attribute__((weak)); + +extern void _init (void); +extern void _fini (void); + +/* Iterate over all the init routines. */ +void +__libc_init_array (void) +{ + size_t count; + size_t i; + + count = __preinit_array_end - __preinit_array_start; + for (i = 0; i < count; i++) + __preinit_array_start[i] (); + + _init (); + + count = __init_array_end - __init_array_start; + for (i = 0; i < count; i++) + __init_array_start[i] (); +} + +/* Run all the cleanup routines. */ +void +__libc_fini_array (void) +{ + size_t count; + size_t i; + + count = __fini_array_end - __fini_array_start; + for (i = 0; i < count; i++) + __fini_array_start[i] (); + + _fini (); +} +#endif diff --git a/newlib/libc/sys/arm/crt0.S b/newlib/libc/sys/arm/crt0.S index 5772228aa..00a037a0d 100644 --- a/newlib/libc/sys/arm/crt0.S +++ b/newlib/libc/sys/arm/crt0.S @@ -1,3 +1,4 @@ +#include "newlib.h" #include "swi.h" /* ANSI concatenation macros. */ @@ -10,6 +11,11 @@ #error __USER_LABEL_PREFIX is not defined #endif +#ifdef HAVE_INITFINI_ARRAY +#define _init __libc_init_array +#define _fini __libc_fini_array +#endif + /* .text is used instead of .section .text so it works with arm-aout too. */ .text .code 32 |