This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: initfini.c -> crt[in].S
On Tue, 7 Feb 2012, Roland McGrath wrote:
> For the last few years, glibc releases have coincided with Fedora releases,
> which are about every six months. This thread is not the place to really
> discuss the release cycle plans, but we can use this as a guide for setting
> this deadline for arch maintainers. I think we should be aiming for
> cutting our release branches by the time Fedora goes to beta. According to
> http://fedoraproject.org/wiki/Releases/17/Schedule that will be on April
> 3rd (it's not uncommon for these dates to slip by a week), with the "change
> deadline" on March 20. Let's say April 1 is the deadline for crt[in].S.
That seems fine as a deadline for this fix.
> > * csu/Makefile: Support crti.S and crtn.S in source directory.
>
> It's become somewhat common to use vague log entries like this. But IMHO
> the standard remains a log entry that mentions the variables and targets
> added, removed, or changed.
The change is more at the level of changing conditionals than the
individual variables and targets inside them - and with the version below,
this is even more the case; that's why I didn't feel there were meaningful
changes to individual names makefile items to list. But I've written the
entry below in terms of changing each newly conditioned rule or target.
> > +ifneq (,$(wildcard $(sysdirs:%=%/crti.S)))
> > +
> > +vpath crti.S $(sysdirs)
> > +vpath crtn.S $(sysdirs)
>
> Why are these necessary? The usual sysd-rules rules ought to find these
> just like all other sources are found.
Removed below (this was following what was done for initfini.c).
> > +CFLAGS-crti.S = -g0
> > +CFLAGS-crtn.S = -g0
>
> I'm not convinced these are desireable. They made sense for the C code
> when it was being sliced up. But now these are just assembly sources like
> all the others, so why shouldn't they have normal source line information?
>
> CFI also seems worthwhile, though that could come later since we didn't
> have it before.
Source line information ought to work; I've removed those options. CFI is
riskier and I'm not sure it will work for these fragments in a useful way
given that they aren't complete functions (gas doesn't like .cfi_startproc
without matching .cfi_endproc).
> > + Copyright (C) 1995-1997,2000-2002,2012 Free Software Foundation, Inc.
>
> This is actually a wholly new file at this point. Just use 2012.
Changed for this file. Also put in the LGPL v2.1 version of the license /
exception notice, since I noticed there were two different versions in use
with some files still using an LGPL v2 version.
> > 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>
>
> Then why do we need it at all? We can just use the vanilla crtn.o for
> libpthread too.
Now just building crtn.S via the automatic rules (it gets built separately
in each directory, but the disassembly is the same).
> > + .p2align 2,,3
>
> Why isn't just ".p2align 2" sufficient?
Fixed.
I hope this version addresses all your comments including those I didn't
specifically remark on.
2012-02-07 Joseph Myers <joseph@codesourcery.com>
* csu/Makefile (generated): Do not append for crti.S in sysdirs.
(omit-deps): Likewise.
($(crtstuff:%=$(objpfx)%.o)): Do not define for crti.S in sysdirs.
(CFLAGS-initfini.s): Likewise.
($(objpfx)initfini.s): Disable for crti.S in sysdirs.
($(objpfx)crti.S): Likewise.
($(objpfx)crtn.S): Likewise.
($(patsubst %,$(objpfx)crt%.o,i n)): Likewise.
($(objpfx)defs.h): Likewise.
(initfini.c): Remove vpath directive for crti.S in sysdirs.
* 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 (omit-deps): Do not append for crti.S in sysdirs.
(CFLAGS-pt-initfini.s): Do not define for crti.S in sysdirs.
($(objpfx)pt-initfini.s): Likewise.
(pt-initfini.c): Remove vpath directive for crti.S in sysdirs.
($(objpfx)crti.o): New rule for crti.S in sysdirs.
($(objpfx)crti.S): Disable for crti.S in sysdirs.
($(objpfx)crtn.S): Likewise.
($(objpfx)defs.h): Likewise.
($(objpfx)crti.o): Likewise.
($(objpfx)crtn.o): Likewise.
* pt-crti.S: New.
* sysdeps/unix/sysv/linux/i386/Makefile: Remove.
diff --git a/csu/Makefile b/csu/Makefile
index 601264d..69be9df 100644
--- a/csu/Makefile
+++ b/csu/Makefile
@@ -84,6 +84,9 @@ crtstuff = crti crtn
install-lib += $(crtstuff:=.o)
extra-objs += $(crtstuff:=.o)
+
+ifeq (,$(wildcard $(sysdirs:%=%/crti.S)))
+
generated += $(crtstuff:=.S) initfini.s defs.h
omit-deps += $(crtstuff)
@@ -122,6 +125,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..4d2eb88 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,24 @@ $(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)))
+
+$(objpfx)crti.o: $(objpfx)pt-crti.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 +585,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..0a1d557
--- /dev/null
+++ b/nptl/pt-crti.S
@@ -0,0 +1,40 @@
+/* Special .init and .fini section support for libpthread.
+ Copyright (C) 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. */
+
+#define PREINIT_FUNCTION __pthread_initialize_minimal_internal
+#define PREINIT_FUNCTION_WEAK 0
+
+#include <crti.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..c210def
--- /dev/null
+++ b/sysdeps/i386/crti.S
@@ -0,0 +1,83 @@
+/* Special .init and .fini section support for x86.
+ Copyright (C) 1995-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
+ .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
+ .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..2a7d00b
--- /dev/null
+++ b/sysdeps/i386/crtn.S
@@ -0,0 +1,48 @@
+/* Special .init and .fini section support for x86.
+ Copyright (C) 1995-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,"ax",@progbits
+ addl $8, %esp
+ popl %ebx
+ ret
+
+ .section .fini,"ax",@progbits
+ 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