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>
|
2005-01-06 Jeff Johnston <jjohnstn@redhat.com>
|
||||||
|
|
||||||
* libc/stdlib/strtod.c (_strtod_r): Add NaN support.
|
* libc/stdlib/strtod.c (_strtod_r): Add NaN support.
|
||||||
|
|
|
@ -103,6 +103,7 @@ SYS_OBJECTLIST = @SYS_OBJECTLIST@
|
||||||
UNIX_OBJECTLIST = @UNIX_OBJECTLIST@
|
UNIX_OBJECTLIST = @UNIX_OBJECTLIST@
|
||||||
VERSION = @VERSION@
|
VERSION = @VERSION@
|
||||||
aext = @aext@
|
aext = @aext@
|
||||||
|
libc_cv_initfinit_array = @libc_cv_initfinit_array@
|
||||||
libm_machine_dir = @libm_machine_dir@
|
libm_machine_dir = @libm_machine_dir@
|
||||||
machine_dir = @machine_dir@
|
machine_dir = @machine_dir@
|
||||||
newlib_basedir = @newlib_basedir@
|
newlib_basedir = @newlib_basedir@
|
||||||
|
|
|
@ -3425,6 +3425,40 @@ EOF
|
||||||
done
|
done
|
||||||
fi;
|
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
|
trap '' 1 2 15
|
||||||
cat > confcache <<\EOF
|
cat > confcache <<\EOF
|
||||||
# This file is a shell script that caches the results of configure
|
# 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%@UNIX_OBJECTLIST@%$UNIX_OBJECTLIST%g
|
||||||
s%@STDIO64_OBJECTLIST@%$STDIO64_OBJECTLIST%g
|
s%@STDIO64_OBJECTLIST@%$STDIO64_OBJECTLIST%g
|
||||||
s%@CC_FOR_BUILD@%$CC_FOR_BUILD%g
|
s%@CC_FOR_BUILD@%$CC_FOR_BUILD%g
|
||||||
|
s%@libc_cv_initfinit_array@%$libc_cv_initfinit_array%g
|
||||||
|
|
||||||
CEOF
|
CEOF
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -329,6 +329,31 @@ if test "x${iconv_encodings}" != "x" \
|
||||||
done
|
done
|
||||||
fi;
|
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,
|
AC_OUTPUT(Makefile,
|
||||||
[if test -n "$CONFIG_FILES"; then
|
[if test -n "$CONFIG_FILES"; then
|
||||||
unset ac_file
|
unset ac_file
|
||||||
|
|
|
@ -4,7 +4,7 @@ AUTOMAKE_OPTIONS = cygnus
|
||||||
|
|
||||||
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
|
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
|
libmisc_la_LDFLAGS = -Xcompiler -nostdlib
|
||||||
|
|
||||||
|
|
|
@ -110,7 +110,7 @@ AUTOMAKE_OPTIONS = cygnus
|
||||||
|
|
||||||
INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
|
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
|
libmisc_la_LDFLAGS = -Xcompiler -nostdlib
|
||||||
|
|
||||||
|
@ -140,11 +140,12 @@ CPPFLAGS = @CPPFLAGS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
lib_a_LIBADD =
|
lib_a_LIBADD =
|
||||||
@USE_LIBTOOL_FALSE@lib_a_OBJECTS = dprintf.$(OBJEXT) unctrl.$(OBJEXT) \
|
@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)
|
LTLIBRARIES = $(noinst_LTLIBRARIES)
|
||||||
|
|
||||||
libmisc_la_LIBADD =
|
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@
|
CFLAGS = @CFLAGS@
|
||||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_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)
|
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"
|
#include "swi.h"
|
||||||
|
|
||||||
/* ANSI concatenation macros. */
|
/* ANSI concatenation macros. */
|
||||||
|
@ -10,6 +11,11 @@
|
||||||
#error __USER_LABEL_PREFIX is not defined
|
#error __USER_LABEL_PREFIX is not defined
|
||||||
#endif
|
#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 is used instead of .section .text so it works with arm-aout too. */
|
||||||
.text
|
.text
|
||||||
.code 32
|
.code 32
|
||||||
|
|
|
@ -137,5 +137,9 @@
|
||||||
#undef _ICONV_FROM_ENCODING_WIN_1257
|
#undef _ICONV_FROM_ENCODING_WIN_1257
|
||||||
#undef _ICONV_FROM_ENCODING_WIN_1258
|
#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__ */
|
#endif /* !__NEWLIB_H__ */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue