diff options
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | csu/Makefile | 9 | ||||
-rw-r--r-- | nptl/ChangeLog | 16 | ||||
-rw-r--r-- | nptl/Makefile | 19 | ||||
-rw-r--r-- | nptl/pt-crti.S | 44 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/i386/Makefile | 3 | ||||
-rw-r--r-- | sysdeps/i386/Makefile | 6 | ||||
-rw-r--r-- | sysdeps/i386/crti.S | 85 | ||||
-rw-r--r-- | sysdeps/i386/crtn.S | 48 | ||||
-rw-r--r-- | sysdeps/i386/elf/Makefile | 4 |
10 files changed, 239 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog index 2ebf72b1de..cdaba6bbed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2012-02-08 Joseph Myers <joseph@codesourcery.com> + + Support crti.S and crtn.S provided directly by architectures. + * csu/Makefile [crti.S in sysdirs] (generated): Do not append. + [crti.S in sysdirs] (omit-deps): Likewise. + [crti.S in sysdirs] (CFLAGS-initfini.s): Do not define variable. + [crti.S in sysdirs] ($(crtstuff:%=$(objpfx)%.o)): Disable rule. + [crti.S in sysdirs] ($(objpfx)initfini.s): Likewise. + [crti.S in sysdirs] ($(objpfx)crti.S): Likewise. + [crti.S in sysdirs] ($(objpfx)crtn.S): Likewise. + [crti.S in sysdirs] ($(patsubst %,$(objpfx)crt%.o,i n)): Likewise. + [crti.S in sysdirs] ($(objpfx)defs.h): Likewise. + [crti.S in sysdirs] (initfini.c): Remove vpath directive. + * sysdeps/i386/crti.S, sysdeps/i386/crtn.S: New files, based on + compiler output for sysdeps/generic/initfini.c. + * sysdeps/i386/elf/Makefile: Remove file. + * sysdeps/i386/Makefile (CFLAGS-initfini.s): Remove variable. + 2012-02-07 Marek Polacek <polacek@redhat.com> * sysdeps/generic/_G_config.h: Remove _G_ARGS macro. diff --git a/csu/Makefile b/csu/Makefile index 601264d952..05bc0e47e5 100644 --- a/csu/Makefile +++ b/csu/Makefile @@ -84,6 +84,13 @@ crtstuff = crti crtn install-lib += $(crtstuff:=.o) extra-objs += $(crtstuff:=.o) + +# Conditionals on the existence of a sysdeps version of crti.S are +# temporary until all targets either have such a file or have been +# removed, after which the old approach of postprocessing compiler +# output will be removed. +ifeq (,$(wildcard $(sysdirs:%=%/crti.S))) + generated += $(crtstuff:=.S) initfini.s defs.h omit-deps += $(crtstuff) @@ -122,6 +129,8 @@ $(objpfx)defs.h: $(objpfx)initfini.s endif +endif + extra-objs += abi-note.o init.o asm-CPPFLAGS += -I$(objpfx). diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 1470566fb7..8ff14a9f23 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,19 @@ +2012-02-08 Joseph Myers <joseph@codesourcery.com> + + Support crti.S and crtn.S provided directly by architectures. + * Makefile [crti.S in sysdirs] (omit-deps): Do not append. + [crti.S in sysdirs] (CFLAGS-pt-initfini.s): Do not define variable. + [crti.S in sysdirs] ($(objpfx)pt-initfini.s): Disable rule. + [crti.S in sysdirs] ($(objpfx)crti.S): Likewise. + [crti.S in sysdirs] ($(objpfx)crtn.S): Likewise. + [crti.S in sysdirs] ($(objpfx)defs.h): Likewise. + [crti.S in sysdirs] ($(objpfx)crti.o): Likewise. + [crti.S in sysdirs] ($(objpfx)crtn.o): Likewise. + [crti.S in sysdirs] (pt-initfini.c): Remove vpath directive. + [crti.S in sysdirs] ($(objpfx)crti.o): New rule. + * pt-crti.S: New file. + * sysdeps/unix/sysv/linux/i386/Makefile: Remove file. + 2012-02-03 Joseph Myers <joseph@codesourcery.com> * sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Use diff --git a/nptl/Makefile b/nptl/Makefile index 0c317b0479..81661b3133 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -335,15 +335,23 @@ ifneq (,$(patsubst .,,$(multidir))) generated-dirs := $(firstword $(subst /, , $(multidir))) crti-objs += $(multidir)/crti.o crtn-objs += $(multidir)/crtn.o +# Conditionals on the existence of a sysdeps version of crti.S are +# temporary until all targets either have such a file or have been +# removed, after which the old approach of postprocessing compiler +# output will be removed. +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 +550,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 +589,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 0000000000..3ea359d7da --- /dev/null +++ b/nptl/pt-crti.S @@ -0,0 +1,44 @@ +/* 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. */ + +/* Arrange for __pthread_initialize_minimal_internal to be called at + libpthread startup, instead of conditionally calling + __gmon_start__. */ + +#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 48eef38a24..0000000000 --- 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 661473e226..e1deecee87 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 0000000000..dfec2cbcd6 --- /dev/null +++ b/sysdeps/i386/crti.S @@ -0,0 +1,85 @@ +/* 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. The symbols _init and _fini are + magic and cause the linker to emit DT_INIT and DT_FINI. */ + +#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 + /* Maintain 16-byte stack alignment for called functions. */ + 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 0000000000..2ea2a382cf --- /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 61064d4ef7..0000000000 --- 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 |