Mercurial > gub
view patches/glibc-2.3-i386-crti-crtn.patch @ 6512:ccc20ae889ca default tip guix
mingw::guile-2.0.7 builds.
author | Jan Nieuwenhuizen <janneke@gnu.org> |
---|---|
date | Thu, 24 Mar 2016 08:03:39 +0100 |
parents | 1a2d0163e88a |
children |
line wrap: on
line source
Support crti.S and crtn.S provided directly by architectures. http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=3add8e1353d62d77fdd9b4ca363cdfe7006b0efb http://sourceware.org/git/?p=glibc.git;a=commitdiff;h=d8e0ca509a83e832123f6ab508fce620159fb2dc --- a/csu/Makefile 2005-02-16 18:34:09.000000000 +0900 +++ b/csu/Makefile 2014-10-25 23:29:25.064874700 +0900 @@ -99,6 +99,13 @@ 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 $(full_config_sysdirs:%=%/crti.S))) + generated += $(crtstuff:=.S) initfini.s defs.h omit-deps += $(crtstuff) @@ -137,6 +144,8 @@ endif +endif + ifeq (yes,$(elf)) extra-objs += abi-note.o init.o asm-CPPFLAGS += -I$(objpfx). --- a/nptl/Makefile 2005-07-18 12:20:10.000000000 +0900 +++ b/nptl/Makefile 2014-10-25 23:38:07.674430000 +0900 @@ -319,15 +319,23 @@ 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 $(full_config_sysdirs:%=%/crti.S))) omit-deps += $(multidir)/crti $(multidir)/crtn +endif $(objpfx)$(multidir): mkdir $@ endif extra-objs += $(crti-objs) $(crtn-objs) +ifeq (,$(wildcard $(full_config_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 @@ -514,15 +522,24 @@ endif ifeq ($(build-shared),yes) +ifeq (,$(wildcard $(full_config_sysdirs:%=%/crti.S))) vpath pt-initfini.c $(full_config_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 $(full_config_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 @@ -544,6 +561,8 @@ $(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 $< $@ --- /dev/null 2014-10-25 23:44:22.000000000 +0900 +++ glibc-2.3-20070416/nptl/pt-crti.S 2014-10-25 23:43:18.445954300 +0900 @@ -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> --- a/sysdeps/i386/Makefile 2014-10-25 23:48:17.508557000 +0900 +++ b/sysdeps/i386/Makefile 2014-10-25 23:48:48.242942200 +0900 @@ -5,12 +5,6 @@ # 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 --- /dev/null 2014-10-25 23:52:40.000000000 +0900 +++ glibc-2.3-20070416/sysdeps/i386/crti.S 2014-10-25 23:51:39.255562800 +0900 @@ -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) --- /dev/null 2014-10-25 23:53:42.000000000 +0900 +++ glibc-2.3-20070416/sysdeps/i386/crtn.S 2014-10-25 23:53:12.068095000 +0900 @@ -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 --- a/sysdeps/i386/sysdep.h 2003-03-10 18:10:46.000000000 +0900 +++ b/sysdeps/i386/sysdep.h 2014-10-29 21:50:27.195372500 +0900 @@ -19,6 +19,31 @@ #include <sysdeps/generic/sysdep.h> +#include <features.h> /* For __GNUC_PREREQ. */ + +/* It is desirable that the names of PIC thunks match those used by + GCC so that multiple copies are eliminated by the linker. Because + GCC 4.6 and earlier use __i686 in the names, it is necessary to + override that predefined macro. */ +#if defined __i686 && defined __ASSEMBLER__ +#undef __i686 +#define __i686 __i686 +#endif + +#ifdef __ASSEMBLER__ +# if __GNUC_PREREQ (4, 7) +# define GET_PC_THUNK(reg) __x86.get_pc_thunk.reg +# else +# define GET_PC_THUNK(reg) __i686.get_pc_thunk.reg +# endif +#else +# if __GNUC_PREREQ (4, 7) +# define GET_PC_THUNK_STR(reg) "__x86.get_pc_thunk." #reg +# else +# define GET_PC_THUNK_STR(reg) "__i686.get_pc_thunk." #reg +# endif +#endif + #ifdef __ASSEMBLER__ /* Syntactic details of assembler. */ @@ -117,6 +142,24 @@ #define PSEUDO_END(name) \ END (name) +# define SETUP_PIC_REG(reg) \ + .ifndef GET_PC_THUNK(reg); \ + .section .gnu.linkonce.t.GET_PC_THUNK(reg),"ax",@progbits; \ + .globl GET_PC_THUNK(reg); \ + .hidden GET_PC_THUNK(reg); \ + .p2align 4; \ + .type GET_PC_THUNK(reg),@function; \ +GET_PC_THUNK(reg): \ + movl (%esp), %e##reg; \ + ret; \ + .size GET_PC_THUNK(reg), . - GET_PC_THUNK(reg); \ + .previous; \ + .endif; \ + call GET_PC_THUNK(reg) + +# define LOAD_PIC_REG(reg) \ + SETUP_PIC_REG(reg); addl $_GLOBAL_OFFSET_TABLE_, %e##reg + #undef JUMPTARGET #ifdef PIC #define JUMPTARGET(name) name##@PLT