diff options
author | Joseph Myers <joseph@codesourcery.com> | 2012-02-08 23:35:36 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2012-02-08 23:35:36 +0000 |
commit | 92e47068b33040b59efdbedfbeedab1cba1e1e62 (patch) | |
tree | aff73949c52c35ecf7296a5b6e72c561d1e7d0b5 | |
parent | 06285c87857a33930a8e3c4b1ca5226b28130864 (diff) | |
download | glibc-92e47068b33040b59efdbedfbeedab1cba1e1e62.tar glibc-92e47068b33040b59efdbedfbeedab1cba1e1e62.tar.gz glibc-92e47068b33040b59efdbedfbeedab1cba1e1e62.tar.bz2 glibc-92e47068b33040b59efdbedfbeedab1cba1e1e62.zip |
Convert ARM to crti.S/crtn.S.
-rw-r--r-- | ChangeLog.arm | 8 | ||||
-rw-r--r-- | sysdeps/arm/crti.S | 94 | ||||
-rw-r--r-- | sysdeps/arm/crtn.S (renamed from sysdeps/arm/initfini.c) | 30 | ||||
-rw-r--r-- | sysdeps/arm/eabi/Makefile | 5 |
4 files changed, 124 insertions, 13 deletions
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 <joseph@codesourcery.com> + + * 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 <joseph@codesourcery.com> * 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 <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 + +#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/initfini.c b/sysdeps/arm/crtn.S index 659ee91401..18be5cc6d3 100644 --- a/sysdeps/arm/initfini.c +++ b/sysdeps/arm/crtn.S @@ -1,5 +1,5 @@ -/* Special .init and .fini section support. ARM version. - Copyright (C) 2006 Free Software Foundation, Inc. +/* 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 @@ -34,9 +34,23 @@ 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 <sysdeps/generic/initfini.c> +#include <sysdep.h> + +/* 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 |