Mercurial > gub
changeset 6259:1a2d0163e88a
Fix linux-x86::glibc-core (glibc-2.3)
Support crti.S and crtn.S provided directly by architectures.
author | Masamichi Hosoda <trueroad@users.noreply.github.com> |
---|---|
date | Wed, 29 Oct 2014 22:29:38 +0900 |
parents | 183550639510 |
children | cbd82fabf5ce |
files | gub/specs/glibc.py patches/glibc-2.3-i386-crti-crtn.patch |
diffstat | 2 files changed, 352 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/gub/specs/glibc.py Sat Oct 25 23:15:55 2014 +0900 +++ b/gub/specs/glibc.py Wed Oct 29 22:29:38 2014 +0900 @@ -52,6 +52,7 @@ 'glibc-2.3-binutils-version-check.patch', 'glibc-2.3-sysdeps-general-initfini.patch', 'glibc-2.3-sysdeps-i386-Makefile.patch', + 'glibc-2.3-i386-crti-crtn.patch', ] dependencies = ['cross/gcc', 'glibc-core', 'tools::bison', 'tools::gzip', 'tools::perl', 'linux-headers'] configure_flags = (target.AutoBuild.configure_flags + misc.join_lines ('''
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/glibc-2.3-i386-crti-crtn.patch Wed Oct 29 22:29:38 2014 +0900 @@ -0,0 +1,351 @@ +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