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:
parent
35310094a1
commit
f7a74742e6
|
@ -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.
|
||||
|
|
|
@ -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@
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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__ */
|
||||
|
||||
|
|
Loading…
Reference in New Issue