* Makeconfig (CPPFLAGS-.oS): Add -DLIBC_NONSHARED=1.
* csu/elf-init.c: New file.
* csu/Makefile (routines, static-only-routines): Add elf-init.
* sysdeps/alpha/elf/start.S: Use __libc_csu_init in place of _init
and __libc_csu_fini in place of _fini.
* sysdeps/arm/elf/start.S: Likewise.
* sysdeps/cris/elf/start.S: Likewise.
* sysdeps/hppa/elf/start.S: Likewise.
* sysdeps/i386/elf/start.S: Likewise.
* sysdeps/ia64/elf/start.S: Likewise.
* sysdeps/m68k/elf/start.S: Likewise.
* sysdeps/mach/hurd/powerpc/static-start.S: Likewise.
* sysdeps/mips/elf/start.S: Likewise.
* sysdeps/powerpc/powerpc32/elf/start.S: Likewise.
* sysdeps/powerpc/powerpc64/elf/start.S: Likewise.
* sysdeps/s390/s390-32/elf/start.S: Likewise.
* sysdeps/s390/s390-64/elf/start.S: Likewise.
* sysdeps/sh/elf/start.S: Likewise.
* sysdeps/sparc/sparc32/elf/start.S: Likewise.
* sysdeps/sparc/sparc64/elf/start.S: Likewise.
* sysdeps/x86_64/elf/start.S: Likewise.
2002-12-08 Roland McGrath <roland@redhat.com>
+ * elf/Makefile (tests): Uncomment tst-array[123].
+ * Makeconfig (CPPFLAGS-.oS): Add -DLIBC_NONSHARED=1.
+ * csu/elf-init.c: New file.
+ * csu/Makefile (routines, static-only-routines): Add elf-init.
+ * sysdeps/alpha/elf/start.S: Use __libc_csu_init in place of _init
+ and __libc_csu_fini in place of _fini.
+ * sysdeps/arm/elf/start.S: Likewise.
+ * sysdeps/cris/elf/start.S: Likewise.
+ * sysdeps/hppa/elf/start.S: Likewise.
+ * sysdeps/i386/elf/start.S: Likewise.
+ * sysdeps/ia64/elf/start.S: Likewise.
+ * sysdeps/m68k/elf/start.S: Likewise.
+ * sysdeps/mach/hurd/powerpc/static-start.S: Likewise.
+ * sysdeps/mips/elf/start.S: Likewise.
+ * sysdeps/powerpc/powerpc32/elf/start.S: Likewise.
+ * sysdeps/powerpc/powerpc64/elf/start.S: Likewise.
+ * sysdeps/s390/s390-32/elf/start.S: Likewise.
+ * sysdeps/s390/s390-64/elf/start.S: Likewise.
+ * sysdeps/sh/elf/start.S: Likewise.
+ * sysdeps/sparc/sparc32/elf/start.S: Likewise.
+ * sysdeps/sparc/sparc64/elf/start.S: Likewise.
+ * sysdeps/x86_64/elf/start.S: Likewise.
+
* sysdeps/pthread/aio_notify.c (notify_func_wrapper): Take a malloc'd
struct containing function ptr and value, free it.
(__aio_notify_only): Allocate that and copy values from SIGEV into it.
# shared objects. We don't want to use CFLAGS-os because users may, for
# example, make that processor-specific.
CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag)
-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC
+CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1
libtype.oS = lib%_nonshared.a
endif
subdir := csu
routines = init-first libc-start $(libc-init) sysdep version check_fds \
- libc-tls
+ libc-tls elf-init
aux = errno
elide-routines.os = libc-tls
+static-only-routines = elf-init
csu-dummies = $(filter-out $(start-installed-name),crt1.o Mcrt1.o)
extra-objs = start.o gmon-start.o \
$(start-installed-name) g$(start-installed-name) $(csu-dummies)
--- /dev/null
+/* Startup support for ELF initializers/finalizers in the main executable.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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 GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <stddef.h>
+
+#ifdef HAVE_INITFINI_ARRAY
+/* These magic symbols are provided by the linker. */
+extern void (*__preinit_array_start []) (void);
+extern void (*__preinit_array_end []) (void);
+extern void (*__init_array_start []) (void);
+extern void (*__init_array_end []) (void);
+extern void (*__fini_array_start []) (void);
+extern void (*__fini_array_end []) (void);
+#endif
+
+/* These function symbols are provided for the .init/.fini section entry
+ points automagically by the linker. */
+extern void _init (void);
+extern void _fini (void);
+
+/* These functions are passed to __libc_start_main by the startup code.
+ These get statically linked into each program. For dynamically linked
+ programs, this module will come from libc_nonshared.a and differs from
+ the libc.a module in that it doesn't call the preinit array. */
+
+void
+__libc_csu_init (void)
+{
+#ifdef HAVE_INITFINI_ARRAY
+ /* For dynamically linked executables the preinit array is executed by
+ the dynamic linker (before initializing any shared object. */
+
+# ifndef LIBC_NONSHARED
+ /* For static executables, preinit happens rights before init. */
+ {
+ const size_t size = __preinit_array_end - __preinit_array_start;
+ size_t i;
+ for (i = 0; i < size; i++)
+ (*__preinit_array_start [i]) ();
+ }
+# endif
+#endif
+
+ _init ();
+
+#ifdef HAVE_INITFINI_ARRAY
+ {
+ const size_t size = __init_array_end - __init_array_start;
+ size_t i;
+ for (i = 0; i < size; i++)
+ (*__init_array_start [i]) ();
+ }
+#endif
+}
+
+void
+__libc_csu_fini (void)
+{
+#ifdef HAVE_INITFINI_ARRAY
+ size_t i = __fini_array_end - __fini_array_start;
+ while (i-- > 0)
+ (*__fini_array_start [i]) ();
+#endif
+
+ _fini ();
+}
tests = tst-tls1 tst-tls2 tst-tls9
ifeq (yes,$(have-initfini-array))
-#tests += tst-array1 tst-array2 tst-array3
+tests += tst-array1 tst-array2 tst-array3
endif
ifeq (yes,$(build-static))
tests-static = tst-tls1-static tst-tls2-static
/* Startup code for Alpha/ELF.
- Copyright (C) 1993,1995,1996,1997,1998,2000,2001 Free Software Foundation, Inc.
+ Copyright (C) 1993,1995,1996,1997,1998,2000,2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <rth@tamu.edu>
lda a2, 24(sp) /* get argv */
/* Load address of our own entry points to .fini and .init. */
- lda a3, _init
- lda a4, _fini
+ lda a3, __libc_csu_init
+ lda a4, __libc_csu_fini
/* Store address of the shared library termination function. */
mov v0, a5
/* Startup code for ARM & ELF
- Copyright (C) 1995, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1995, 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
/* Push the last arguments to main() onto the stack */
stmfd sp!, {a1}
- ldr a1, =_fini
+ ldr a1, =__libc_csu_fini
stmfd sp!, {a1}
/* Set up the other arguments for main() that go in registers */
ldr a1, =main
- ldr a4, =_init
+ ldr a4, =__libc_csu_init
/* __libc_start_main (main, argc, argv, init, fini, rtld_fini) */
/* Startup code compliant to the ELF CRIS ABI (to-be-written).
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
move.d pc,r0
sub.d .:GOTOFF,r0
- move.d _init:PLTG,r13
+ move.d __libc_csu_init:PLTG,r13
add.d r0,r13
- move.d _fini:PLTG,r9
+ move.d __libc_csu_fini:PLTG,r9
add.d r0,r9
move.d main:PLTG,r10
add.d r0,r10
#else
- move.d _init,r13
- move.d _fini,r9
+ move.d __libc_csu_init,r13
+ move.d __libc_csu_fini,r9
move.d main,r10
#endif
push r9
+/* ELF startup code for HPPA.
+ Copyright (C) 2002 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library 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 GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
.text
.import main, code
.import $global$, data
.import __libc_start_main, code
- .import _fini, code
- .import _init, code
+ .import __libc_csu_fini, code
+ .import __libc_csu_init, code
-
-
-
.globl _start
.export _start, ENTRY
.type _start,@function
/* Expand the stack to store the 5th through 7th args */
ldo 64(%sp), %sp
-
+
/* void (*rtld_fini) (void) (actually the 6th arg) */
stw %r23, -56(%sp)
-
+
/* void (*init) (void) */
- ldil LP%_init, %r23
- ldo RP%_init(%r23), %r23
+ ldil LP%__libc_csu_init, %r23
+ ldo RP%__libc_csu_init(%r23), %r23
/* void (*fini) (void) */
- ldil LP%_fini, %r22
- ldo RP%_fini(%r22), %r22
+ ldil LP%__libc_csu_fini, %r22
+ ldo RP%__libc_csu_fini(%r22), %r22
stw %r22, -52(%sp)
/* void *stack_end */
/* Startup code compliant to the ELF i386 ABI.
- Copyright (C) 1995,1996,1997,1998,2000,2001 Free Software Foundation, Inc.
+ Copyright (C) 1995,1996,1997,1998,2000,2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
termination function. */
/* Push address of our own entry points to .fini and .init. */
- pushl $_fini
- pushl $_init
+ pushl $__libc_csu_fini
+ pushl $__libc_csu_init
pushl %ecx /* Push second argument: argv. */
pushl %esi /* Push first argument: argc. */
-/* Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jes Sorensen, <Jes.Sorensen@cern.ch>, April 1999.
{
addl r11 = @ltoff(__libc_ia64_register_backing_store_base), gp
addl out0 = @ltoff(@fptr(main)), gp
- addl out3 = @ltoff(@fptr(_init)), gp
+ addl out3 = @ltoff(@fptr(__libc_csu_init)), gp
;;
}
{ .mmi
ld8 r3 = [r11] /* pointer to __libc_ia64_register_backing_store_base */
ld8 out0 = [out0] /* pointer to `main' function descriptor */
- addl out4 = @ltoff(@fptr(_fini)), gp
+ addl out4 = @ltoff(@fptr(__libc_csu_fini)), gp
;;
}
{ .mmi
/* Startup code compliant to the ELF m68k ABI.
- Copyright (C) 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
/* Push the address of our own entry points to `.fini' and
`.init'. */
- pea _fini
- pea _init
+ pea __libc_csu_fini
+ pea __libc_csu_init
pea (%a0) /* Push second argument: argv. */
move.l %d0, -(%sp) /* Push first argument: argc. */
/* Startup code for statically linked Hurd/PowerPC binaries.
- Copyright (C) 1998,2001 Free Software Foundation, Inc.
+ Copyright (C) 1998,2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
/* These are the various addresses we require. */
.section ".rodata"
.align 2
- weak_extern(_init)
- weak_extern(_fini)
+ weak_extern(__libc_csu_init)
+ weak_extern(__libc_csu_fini)
L(start_addresses):
.long _SDA_BASE_
.long JUMPTARGET(main)
- .long JUMPTARGET(_init)
- .long JUMPTARGET(_fini)
+ .long JUMPTARGET(__libc_csu_init)
+ .long JUMPTARGET(__libc_csu_fini)
ASM_SIZE_DIRECTIVE(L(start_addresses))
.section ".text"
the stack is aligned to double words (8 bytes). */
and $29, 0xfffffff8
subu $29, 32
- la $7, _init /* init */
- la $8, _fini
+ la $7, __libc_csu_init /* init */
+ la $8, __libc_csu_fini
sw $8, 16($29) /* fini */
sw $2, 20($29) /* rtld_fini */
sw $29, 24($29) /* stack_end */
/* Startup code for programs linked with GNU libc.
- Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
/* These are the various addresses we require. */
.section ".rodata"
.align 2
- weak_extern(_init)
- weak_extern(_fini)
L(start_addresses):
.long _SDA_BASE_
.long JUMPTARGET(BP_SYM (main))
- .long JUMPTARGET(_init)
- .long JUMPTARGET(_fini)
+ .long JUMPTARGET(__libc_csu_init)
+ .long JUMPTARGET(__libc_csu_fini)
ASM_SIZE_DIRECTIVE(L(start_addresses))
.section ".text"
/* These are the various addresses we require. */
.section ".rodata"
.align 3
- weak_extern(_init)
- weak_extern(_fini)
- weak_extern(._init)
- weak_extern(._fini)
L(start_addresses):
.quad 0 /* was _SDA_BASE_ but not in 64-bit ABI*/
/* function descriptors so don't need JUMPTARGET */
- .quad BP_SYM(main)
- .quad _init
- .quad _fini
+ .quad BP_SYM(main)
+ .quad __libc_csu_init
+ .quad __libc_csu_fini
ASM_SIZE_DIRECTIVE(L(start_addresses))
ld r8,.L01(r2)
/* and continue in libc-start, in glibc. */
- b JUMPTARGET(BP_SYM(__libc_start_main))
+ b JUMPTARGET(BP_SYM(__libc_start_main))
END(_start)
/* Startup code compliant to the ELF s390 ABI.
- Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
*/
stm %r14,%r15,96(%r15) # store rtld_fini/stack_end to parameter area
la %r7,96(%r15)
- l %r6,.L2-.Llit(%r13) # load pointer to _fini
- l %r5,.L1-.Llit(%r13) # load pointer to _init
+ l %r6,.L2-.Llit(%r13) # load pointer to __libc_csu_fini
+ l %r5,.L1-.Llit(%r13) # load pointer to __libc_csu_init
l %r2,.L3-.Llit(%r13) # load pointer to main
/* ok, now branch to the libc main routine */
.word 0
.Llit:
-.L1: .long _init
-.L2: .long _fini
+.L1: .long __libc_csu_init
+.L2: .long __libc_csu_fini
.L3: .long main
.L4: .long __libc_start_main
/* Startup code compliant to the 64 bit S/390 ELF ABI.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
This file is part of the GNU C Library.
*/
stmg %r14,%r15,160(%r15) # store rtld_fini/stack_end to parameter area
la %r7,160(%r15)
- larl %r6,_fini # load pointer to _fini
- larl %r5,_init # load pointer to _init
+ larl %r6,__libc_csu_fini # load pointer to __libc_csu_fini
+ larl %r5,__libc_csu_init # load pointer to __libc_csu_init
larl %r2,main # load pointer to main
/* Ok, now branch to the libc main routine. */
/* Startup code for SH & ELF.
- Copyright (C) 1999, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
L_main:
.long main
L_init:
- .long _init
+ .long __libc_csu_init
L_fini:
- .long _fini
+ .long __libc_csu_fini
L_libc_start_main:
.long __libc_start_main
L_abort:
/* Startup code for elf32-sparc
- Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
/* Load the addresses of the user entry points. */
sethi %hi(main), %o0
- sethi %hi(_init), %o3
- sethi %hi(_fini), %o4
+ sethi %hi(__libc_csu_init), %o3
+ sethi %hi(__libc_csu_fini), %o4
or %o0, %lo(main), %o0
- or %o3, %lo(_init), %o3
- or %o4, %lo(_fini), %o4
+ or %o3, %lo(__libc_csu_init), %o3
+ or %o4, %lo(__libc_csu_fini), %o4
/* When starting a binary via the dynamic linker, %g1 contains the
address of the shared library termination function, which will be
/* Startup code for elf64-sparc
- Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
/* Load the addresses of the user entry points. */
sethi %hi(main), %o0
- sethi %hi(_init), %o3
- sethi %hi(_fini), %o4
+ sethi %hi(__libc_csu_init), %o3
+ sethi %hi(__libc_csu_fini), %o4
or %o0, %lo(main), %o0
- or %o3, %lo(_init), %o3
- or %o4, %lo(_fini), %o4
+ or %o3, %lo(__libc_csu_init), %o3
+ or %o4, %lo(__libc_csu_fini), %o4
/* When starting a binary via the dynamic linker, %g1 contains the
address of the shared library termination function, which will be
/* Startup code compliant to the ELF x86-64 ABI.
- Copyright (C) 2001 Free Software Foundation, Inc.
+ Copyright (C) 2001, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Andreas Jaeger <aj@suse.de>, 2001.
pushq %rsp
/* Pass address of our own entry points to .fini and .init. */
- movq $_fini, %r8
- movq $_init, %rcx
+ movq $__libc_csu_fini, %r8
+ movq $__libc_csu_init, %rcx
movq $BP_SYM (main), %rdi