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.
This commit is contained in:
Jeff Johnston 2005-01-07 18:04:39 +00:00
parent 35310094a1
commit f7a74742e6
9 changed files with 147 additions and 4 deletions

View File

@ -1,3 +1,14 @@
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.
2005-01-06 Jeff Johnston <jjohnstn@redhat.com>
* libc/stdlib/strtod.c (_strtod_r): Add NaN support.

View File

@ -103,6 +103,7 @@ SYS_OBJECTLIST = @SYS_OBJECTLIST@
UNIX_OBJECTLIST = @UNIX_OBJECTLIST@
VERSION = @VERSION@
aext = @aext@
libc_cv_initfinit_array = @libc_cv_initfinit_array@
libm_machine_dir = @libm_machine_dir@
machine_dir = @machine_dir@
newlib_basedir = @newlib_basedir@

35
newlib/configure vendored
View File

@ -3425,6 +3425,40 @@ EOF
done
fi;
echo $ac_n "checking for .preinit_array/.init_array/.fini_array support""... $ac_c" 1>&6
echo "configure:3430: checking for .preinit_array/.init_array/.fini_array support" >&5
if eval "test \"`echo '$''{'libc_cv_initfinit_array'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.c <<EOF
int _start (void) { return 0; }
int __start (void) { return 0; }
int foo (void) { return 1; }
int (*fp) (void) __attribute__ ((section (".init_array"))) = foo;
EOF
if { ac_try='${CC} $CFLAGS $CPPFLAGS $LDFLAGS -o conftest conftest.c
-static -nostartfiles -nostdlib 1>&AS_MESSAGE_LOG_FD'; { (eval echo configure:3441: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }
then
if readelf -S conftest | grep -e INIT_ARRAY > /dev/null; then
libc_cv_initfinit_array=yes
else
libc_cv_initfinit_array=no
fi
else
libc_cv_initfinit_array=no
fi
rm -f conftest*
fi
echo "$ac_t""$libc_cv_initfinit_array" 1>&6
if test $libc_cv_initfinit_array = yes; then
cat >> confdefs.h <<EOF
#define HAVE_INITFINI_ARRAY 1
EOF
fi
trap '' 1 2 15
cat > confcache <<\EOF
# This file is a shell script that caches the results of configure
@ -3641,6 +3675,7 @@ s%@SYSCALL_OBJECTLIST@%$SYSCALL_OBJECTLIST%g
s%@UNIX_OBJECTLIST@%$UNIX_OBJECTLIST%g
s%@STDIO64_OBJECTLIST@%$STDIO64_OBJECTLIST%g
s%@CC_FOR_BUILD@%$CC_FOR_BUILD%g
s%@libc_cv_initfinit_array@%$libc_cv_initfinit_array%g
CEOF
EOF

View File

@ -329,6 +329,31 @@ if test "x${iconv_encodings}" != "x" \
done
fi;
AC_CACHE_CHECK(for .preinit_array/.init_array/.fini_array support,
libc_cv_initfinit_array, [dnl
cat > conftest.c <<EOF
int _start (void) { return 0; }
int __start (void) { return 0; }
int foo (void) { return 1; }
int (*fp) (void) __attribute__ ((section (".init_array"))) = foo;
EOF
if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS $LDFLAGS -o conftest conftest.c
-static -nostartfiles -nostdlib 1>&AS_MESSAGE_LOG_FD])
then
if readelf -S conftest | grep -e INIT_ARRAY > /dev/null; then
libc_cv_initfinit_array=yes
else
libc_cv_initfinit_array=no
fi
else
libc_cv_initfinit_array=no
fi
rm -f conftest*])
AC_SUBST(libc_cv_initfinit_array)
if test $libc_cv_initfinit_array = yes; then
AC_DEFINE_UNQUOTED(HAVE_INITFINI_ARRAY)
fi
AC_OUTPUT(Makefile,
[if test -n "$CONFIG_FILES"; then
unset ac_file

View File

@ -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

View File

@ -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)

60
newlib/libc/misc/init.c Normal file
View File

@ -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

View File

@ -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

View File

@ -137,5 +137,9 @@
#undef _ICONV_FROM_ENCODING_WIN_1257
#undef _ICONV_FROM_ENCODING_WIN_1258
/* Define if the linker supports .preinit_array/.init_array/.fini_array
* sections. */
#undef HAVE_INITFINI_ARRAY
#endif /* !__NEWLIB_H__ */