This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: initfini.c -> crt[in].S


On Mon, 6 Feb 2012, Roland McGrath wrote:

> > I think that would be a bad idea; we should try to keep things working on 
> > all libc platforms at every commit (at least to the extent of building OK 
> > and most tests passing) to avoid breaking things for anyone who happens to 
> > want to test and contribute a patch while things are in flux, and to keep 
> > bisection working optimally to find when problems were introduced.  
> 
> That's a reasonable ideal.  But it only really matters in practice if the
> interim state persists for more than a short while.  It persisting is a
> danger if we allow it to begin at all.  

The interim state I don't want to persist is the one where some libc 
architectures are broken.  We've seen in GCC that even a short period 
(days) of breakage sufficient to prevent bisecting is a significant 
problem as other committed patches are liable to build breakage on top of 
breakage.

Sometimes there will be accidental breakage; in such cases if it doesn't 
get fixed very quickly I think we should go for a quick but suboptimal fix 
(possibly reverting the patch causing the build breakage) so that the 
build works pending any optimal fix.

If necessary for a particular change there could be a branch for arch 
maintainers to add their support before it's merged to mainline, but if we 
can keep things working on mainline during a transition there then I think 
that's the better approach, being simpler and easier for people to work 
with.

> If there is a firm deadline for the kludgery going away, then I am less put
> out by it.  But I'm still not convinced.  Either we can just get all the
> arch maintainers to supply the new code in short order, or else the claim
> that the kludge won't persist for a long time is manifestly false.

I'd suggest 2.16 release as that deadline (by which we declare non-updated 
architectures to be unmaintained, whether or not they have someone 
nominally listed as maintainer).

> It's obvious that there need only ever be a single pt-crti.S.  Its sole
> purpose for being is the one simple difference from the vanilla crti.S.
> It's easy to get the parameterization right from the beginning.  It's a
> clear advantage not to need yet another fiddly per-machine file in nptl.

This patch has a common pt-crti.S and pt-crtn.S.

2012-02-07  Joseph Myers  <joseph@codesourcery.com>

	* csu/Makefile: Support crti.S and crtn.S in source directory.
	* sysdeps/i386/crti.S, sysdeps/i386/crtn.S: New.  Based on
	compiler output for sysdeps/generic/initfini.c.
	* sysdeps/i386/elf/Makefile: Remove.
	* sysdeps/i386/Makefile (CFLAGS-initfini.s): Remove.

nptl:
2012-02-07  Joseph Myers  <joseph@codesourcery.com>

	* Makefile: Support pt-crti.S and pt-crtn.S in source directory.
	* pt-crti.S, pt-crtn.S: New.
	* sysdeps/unix/sysv/linux/i386/Makefile: Remove.

diff --git a/csu/Makefile b/csu/Makefile
index 601264d..9f05c51 100644
--- a/csu/Makefile
+++ b/csu/Makefile
@@ -84,6 +84,17 @@ crtstuff = crti crtn
 
 install-lib += $(crtstuff:=.o)
 extra-objs += $(crtstuff:=.o)
+
+ifneq (,$(wildcard $(sysdirs:%=%/crti.S)))
+
+vpath crti.S $(sysdirs)
+vpath crtn.S $(sysdirs)
+
+CFLAGS-crti.S = -g0
+CFLAGS-crtn.S = -g0
+
+else
+
 generated += $(crtstuff:=.S) initfini.s defs.h
 omit-deps += $(crtstuff)
 
@@ -122,6 +133,8 @@ $(objpfx)defs.h: $(objpfx)initfini.s
 
 endif
 
+endif
+
 extra-objs += abi-note.o init.o
 asm-CPPFLAGS += -I$(objpfx).
 
diff --git a/nptl/Makefile b/nptl/Makefile
index 0c317b0..3b1c383 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -335,15 +335,19 @@ ifneq (,$(patsubst .,,$(multidir)))
 generated-dirs := $(firstword $(subst /, , $(multidir)))
 crti-objs += $(multidir)/crti.o
 crtn-objs += $(multidir)/crtn.o
+ifeq (,$(wildcard $(sysdirs:%=%/crti.S)))
 omit-deps += $(multidir)/crti $(multidir)/crtn
+endif
 $(objpfx)$(multidir):
 	mkdir -p $@
 endif
 extra-objs += $(crti-objs) $(crtn-objs)
+ifeq (,$(wildcard $(sysdirs:%=%/crti.S)))
 omit-deps += crti crtn
 
 CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time)
 endif
+endif
 
 CFLAGS-flockfile.c = -D_IO_MTSAFE_IO
 CFLAGS-ftrylockfile.c = -D_IO_MTSAFE_IO
@@ -542,15 +546,30 @@ $(addprefix $(objpfx),$(tests) $(test-srcs)): $(objpfx)libpthread.a
 endif
 
 ifeq ($(build-shared),yes)
+ifeq (,$(wildcard $(sysdirs:%=%/crti.S)))
 vpath pt-initfini.c $(sysdirs)
 
 $(objpfx)pt-initfini.s: pt-initfini.c
 	$(compile.c) -S $(CFLAGS-pt-initfini.s) -finhibit-size-directive \
 		$(patsubst -f%,-fno-%,$(exceptions)) -o $@
+endif
 
 $(objpfx)tst-cleanup0.out: /dev/null $(objpfx)tst-cleanup0
 	$(make-test-out) 2>&1 | cmp - tst-cleanup0.expect > $@
 
+ifneq (,$(wildcard $(sysdirs:%=%/crti.S)))
+
+CFLAGS-pt-crti.S = -g0
+CFLAGS-pt-crtn.S = -g0
+
+$(objpfx)crti.o: $(objpfx)pt-crti.o
+	ln -f $< $@
+
+$(objpfx)crtn.o: $(objpfx)pt-crtn.o
+	ln -f $< $@
+
+else
+
 # We only have one kind of startup code files.  Static binaries and
 # shared libraries are build using the PIC version.
 $(objpfx)crti.S: $(objpfx)pt-initfini.s
@@ -572,6 +591,8 @@ $(objpfx)crti.o: $(objpfx)crti.S $(objpfx)defs.h
 $(objpfx)crtn.o: $(objpfx)crtn.S $(objpfx)defs.h
 	$(compile.S) -g0 $(ASFLAGS-.os) -o $@
 
+endif
+
 ifneq ($(multidir),.)
 $(objpfx)$(multidir)/crti.o: $(objpfx)crti.o $(objpfx)$(multidir)/
 	ln -f $< $@
diff --git a/nptl/pt-crti.S b/nptl/pt-crti.S
new file mode 100644
index 0000000..c555b49
--- /dev/null
+++ b/nptl/pt-crti.S
@@ -0,0 +1,32 @@
+/* Special .init and .fini section support for x86.  NPTL version.
+   Copyright (C) 1995-1997,2000-2002,2012 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 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file.  (The Library General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   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; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#define PREINIT_FUNCTION __pthread_initialize_minimal_internal
+#define PREINIT_FUNCTION_WEAK 0
+
+#include <crti.S>
diff --git a/nptl/pt-crtn.S b/nptl/pt-crtn.S
new file mode 100644
index 0000000..b7075da
--- /dev/null
+++ b/nptl/pt-crtn.S
@@ -0,0 +1 @@
+#include <crtn.S>
diff --git a/nptl/sysdeps/unix/sysv/linux/i386/Makefile b/nptl/sysdeps/unix/sysv/linux/i386/Makefile
deleted file mode 100644
index 48eef38..0000000
--- a/nptl/sysdeps/unix/sysv/linux/i386/Makefile
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),nptl)
-CFLAGS-pt-initfini.s += -fno-asynchronous-unwind-tables
-endif
diff --git a/sysdeps/i386/Makefile b/sysdeps/i386/Makefile
index 661473e..e1deece 100644
--- a/sysdeps/i386/Makefile
+++ b/sysdeps/i386/Makefile
@@ -5,12 +5,6 @@ asm-CPPFLAGS += -DGAS_SYNTAX
 # The i386 `long double' is a distinct type we support.
 long-double-fcts = yes
 
-ifeq ($(subdir),csu)
-# On i686 we must avoid generating the trampoline functions generated
-# to get the GOT pointer.
-CFLAGS-initfini.s += -march=i386 -mtune=i386
-endif
-
 ifeq ($(subdir),gmon)
 sysdep_routines += i386-mcount
 endif
diff --git a/sysdeps/i386/crti.S b/sysdeps/i386/crti.S
new file mode 100644
index 0000000..af36ed7
--- /dev/null
+++ b/sysdeps/i386/crti.S
@@ -0,0 +1,83 @@
+/* Special .init and .fini section support for x86.
+   Copyright (C) 1995-1997, 2000, 2012 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.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file. (The GNU Lesser General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   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.  */
+
+/* crti.S puts a function prologue at the beginning of the .init and
+   .fini sections and defines global symbols for those addresses, so
+   they can be called as functions.  */
+
+#include <libc-symbols.h>
+#include <sysdep.h>
+
+#ifndef PREINIT_FUNCTION
+#define PREINIT_FUNCTION __gmon_start__
+#endif
+
+#ifndef PREINIT_FUNCTION_WEAK
+#define PREINIT_FUNCTION_WEAK 1
+#endif
+
+#if PREINIT_FUNCTION_WEAK
+	weak_extern (PREINIT_FUNCTION)
+#else
+	.hidden PREINIT_FUNCTION
+#endif
+
+	.section	.init,"ax",@progbits
+	.p2align	2,,3
+	.globl	_init
+	.type	_init, @function
+_init:
+	pushl	%ebx
+	subl	$8, %esp
+	LOAD_PIC_REG (bx)
+#if PREINIT_FUNCTION_WEAK
+	movl PREINIT_FUNCTION@GOT(%ebx), %eax
+	testl %eax, %eax
+	je .Lno_weak_fn
+	call PREINIT_FUNCTION@PLT
+.Lno_weak_fn:
+#else
+	call PREINIT_FUNCTION
+#endif
+
+	.section	.fini,"ax",@progbits
+	.p2align	2,,3
+	.globl	_fini
+	.type	_fini, @function
+_fini:
+	pushl	%ebx
+	subl	$8, %esp
+	LOAD_PIC_REG (bx)
diff --git a/sysdeps/i386/crtn.S b/sysdeps/i386/crtn.S
new file mode 100644
index 0000000..6417524
--- /dev/null
+++ b/sysdeps/i386/crtn.S
@@ -0,0 +1,48 @@
+/* Special .init and .fini section support for x86.
+   Copyright (C) 1995-1997, 2000, 2012 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.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file with other
+   programs, and to distribute those programs without any restriction
+   coming from the use of this file. (The GNU Lesser General Public
+   License restrictions do apply in other respects; for example, they
+   cover modification of the file, and distribution when not linked
+   into another program.)
+
+   Note that people who make modified versions of this file are not
+   obligated to grant this special exception for their modified
+   versions; it is their choice whether to do so. The GNU Lesser
+   General Public License gives permission to release a modified
+   version without this exception; this exception also makes it
+   possible to release a modified version which carries forward this
+   exception.
+
+   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.  */
+
+/* crtn.S puts function epilogues in the .init and .fini sections
+   corresponding to the prologues in crti.S. */
+
+	.section	.init
+	addl	$8, %esp
+	popl	%ebx
+	ret
+
+	.section	.fini
+	addl	$8, %esp
+	popl	%ebx
+	ret
diff --git a/sysdeps/i386/elf/Makefile b/sysdeps/i386/elf/Makefile
deleted file mode 100644
index 61064d4..0000000
--- a/sysdeps/i386/elf/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-ifeq ($(subdir),csu)
-# Turn off -fasynchronous-unwind-tables
-CFLAGS-initfini.s += -fno-asynchronous-unwind-tables
-endif

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]