From 92e47068b33040b59efdbedfbeedab1cba1e1e62 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Wed, 8 Feb 2012 23:35:36 +0000 Subject: Convert ARM to crti.S/crtn.S. --- ChangeLog.arm | 8 ++++ sysdeps/arm/crti.S | 94 +++++++++++++++++++++++++++++++++++++++++++++++ sysdeps/arm/crtn.S | 56 ++++++++++++++++++++++++++++ sysdeps/arm/eabi/Makefile | 5 --- sysdeps/arm/initfini.c | 42 --------------------- 5 files changed, 158 insertions(+), 47 deletions(-) create mode 100644 sysdeps/arm/crti.S create mode 100644 sysdeps/arm/crtn.S delete mode 100644 sysdeps/arm/initfini.c diff --git a/ChangeLog.arm b/ChangeLog.arm index 62531a4493..75c8f54cf0 100644 --- a/ChangeLog.arm +++ b/ChangeLog.arm @@ -1,3 +1,11 @@ +2012-02-08 Joseph Myers + + * sysdeps/arm/crti.S, sysdeps/arm/crtn.S: New files, based on + compiler output for sysdeps/generic/initfini.c. + * sysdeps/arm/initfini.c: Remove file. + * sysdeps/arm/eabi/Makefile (CFLAGS-initfini.s) + (CFLAGS-pt-initfini.s): Remove variables. + 2012-01-08 Joseph Myers * sysdeps/arm/eabi/bits/fenv.h: Use const instead of __const. diff --git a/sysdeps/arm/crti.S b/sysdeps/arm/crti.S new file mode 100644 index 0000000000..facb1e6c61 --- /dev/null +++ b/sysdeps/arm/crti.S @@ -0,0 +1,94 @@ +/* Special .init and .fini section support for ARM. + 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 +#include + +#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 + +#if PREINIT_FUNCTION_WEAK + .p2align 2 + .type call_weak_fn, %function +call_weak_fn: + ldr r3, .LGOT + ldr r2, .LGOT+4 +.LPIC: + add r3, pc, r3 + ldr r2, [r3, r2] + cmp r2, #0 + bxeq lr + b PREINIT_FUNCTION + .p2align 2 +.LGOT: + .word _GLOBAL_OFFSET_TABLE_-(.LPIC+8) + .word PREINIT_FUNCTION(GOT) +#endif + + .section .init,"ax",%progbits + .p2align 2 + .globl _init + .type _init, %function +_init: + stmfd sp!, {r3, lr} +#if PREINIT_FUNCTION_WEAK + bl call_weak_fn +#else + bl PREINIT_FUNCTION +#endif + + .section .fini,"ax",%progbits + .p2align 2 + .globl _fini + .type _fini, %function +_fini: + stmfd sp!, {r3, lr} diff --git a/sysdeps/arm/crtn.S b/sysdeps/arm/crtn.S new file mode 100644 index 0000000000..18be5cc6d3 --- /dev/null +++ b/sysdeps/arm/crtn.S @@ -0,0 +1,56 @@ +/* Special .init and .fini section support for ARM. + 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. */ + +#include + +/* crtn.S puts function epilogues in the .init and .fini sections + corresponding to the prologues in crti.S. */ + + .section .init,"ax",%progbits +#ifdef __ARM_ARCH_4T__ + ldmfd sp!, {r3, lr} + bx lr +#else + ldmfd sp!, {r3, pc} +#endif + + .section .fini,"ax",%progbits +#ifdef __ARM_ARCH_4T__ + ldmfd sp!, {r3, lr} + bx lr +#else + ldmfd sp!, {r3, pc} +#endif diff --git a/sysdeps/arm/eabi/Makefile b/sysdeps/arm/eabi/Makefile index 20572d43bc..025465ad2a 100644 --- a/sysdeps/arm/eabi/Makefile +++ b/sysdeps/arm/eabi/Makefile @@ -3,7 +3,6 @@ aeabi_constants = aeabi_lcsts aeabi_sighandlers aeabi_math aeabi_routines = aeabi_assert aeabi_localeconv aeabi_errno_addr \ aeabi_mb_cur_max aeabi_atexit aeabi_memclr aeabi_memcpy \ aeabi_memmove aeabi_memset -CFLAGS-initfini.s += -fno-asynchronous-unwind-tables -fno-unwind-tables sysdep_routines += $(aeabi_constants) $(aeabi_routines) static-only-routines += $(aeabi_constants) @@ -29,7 +28,3 @@ endif ifeq ($(subdir),math) $(objpfx)libm.so: $(elfobjdir)/ld.so endif - -ifeq ($(subdir),nptl) -CFLAGS-pt-initfini.s += -fno-asynchronous-unwind-tables -fno-unwind-tables -endif diff --git a/sysdeps/arm/initfini.c b/sysdeps/arm/initfini.c deleted file mode 100644 index 659ee91401..0000000000 --- a/sysdeps/arm/initfini.c +++ /dev/null @@ -1,42 +0,0 @@ -/* Special .init and .fini section support. ARM version. - Copyright (C) 2006 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. */ - -/* Prevent this function from being inlined. Otherwise half of its - constant pool will end up in crti and the other half in crtn. */ - -static void call_gmon_start (void) __attribute__((noinline)); - -#include -- cgit v1.2.3