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