2012-02-10 12:28:07 +00:00
|
|
|
/* Special .init and .fini section support for MIPS (n64).
|
2019-01-01 00:11:28 +00:00
|
|
|
Copyright (C) 1995-2019 Free Software Foundation, Inc.
|
2012-02-10 12:28:07 +00:00
|
|
|
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
|
2012-03-09 23:56:38 +00:00
|
|
|
License along with the GNU C Library. If not, see
|
|
|
|
<http://www.gnu.org/licenses/>. */
|
2012-02-10 12:28:07 +00:00
|
|
|
|
|
|
|
/* 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>
|
|
|
|
|
2016-11-23 12:39:39 +00:00
|
|
|
#ifdef __mips_micromips
|
|
|
|
# define JALR_RELOC R_MICROMIPS_JALR
|
|
|
|
#else
|
|
|
|
# define JALR_RELOC R_MIPS_JALR
|
|
|
|
#endif
|
|
|
|
|
2012-02-10 12:28:07 +00:00
|
|
|
#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
|
|
|
|
|
2013-02-27 23:45:07 +00:00
|
|
|
.set nomips16
|
|
|
|
|
2012-02-10 12:28:07 +00:00
|
|
|
.section .init,"ax",@progbits
|
|
|
|
.p2align 2
|
|
|
|
.globl _init
|
2018-06-08 17:28:38 +00:00
|
|
|
.hidden _init
|
2012-02-10 12:28:07 +00:00
|
|
|
.type _init, @function
|
|
|
|
_init:
|
|
|
|
daddiu $sp,$sp,-16
|
|
|
|
sd $28,0($sp)
|
|
|
|
lui $28,%hi(%neg(%gp_rel(_init)))
|
|
|
|
daddu $28,$28,$25
|
|
|
|
sd $31,8($sp)
|
|
|
|
daddiu $28,$28,%lo(%neg(%gp_rel(_init)))
|
|
|
|
#if PREINIT_FUNCTION_WEAK
|
|
|
|
ld $2,%got_disp(PREINIT_FUNCTION)($28)
|
|
|
|
beq $2,$0,.Lno_weak_fn
|
|
|
|
ld $25,%call16(PREINIT_FUNCTION)($28)
|
2016-11-23 12:39:39 +00:00
|
|
|
.reloc 1f,JALR_RELOC,PREINIT_FUNCTION
|
2012-02-10 12:28:07 +00:00
|
|
|
1: jalr $25
|
|
|
|
.Lno_weak_fn:
|
MIPS: Add `.insn' to ensure a text label is defined as code not data
Avoid a build error with microMIPS compilation and recent versions of
GAS which complain if a branch targets a label which is marked as data
rather than microMIPS code:
../sysdeps/mips/mips32/crti.S: Assembler messages:
../sysdeps/mips/mips32/crti.S:72: Error: branch to a symbol in another ISA mode
make[2]: *** [.../csu/crti.o] Error 1
as commit 9d862524f6ae ("MIPS: Verify the ISA mode and alignment of
branch and jump targets") closed a hole in branch processing, making
relocation calculation respect the ISA mode of the symbol referred.
This allowed diagnosing the situation where an attempt is made to pass
control from code assembled for one ISA mode to code assembled for a
different ISA mode and either relaxing the branch to a cross-mode jump
or if that is not possible, then reporting this as an error rather than
letting such code build and then fail unpredictably at the run time.
This however requires the correct annotation of branch targets as code,
because the ISA mode is not relevant for data symbols and is therefore
not recorded for them. The `.insn' pseudo-op is used for this purpose
and has been supported by GAS since:
Wed Feb 12 14:36:29 1997 Ian Lance Taylor <ian@cygnus.com>
* config/tc-mips.c (mips_pseudo_table): Add "insn".
(s_insn): New static function.
* doc/c-mips.texi: Document .insn.
so there has been no reason to avoid it where required. More recently
this pseudo-op has been documented, by the microMIPS architecture
specification[1][2], as required for the correct interpretation of any
code label which is not followed by an actual instruction in an assembly
source.
Use it in our crti.S files then, to mark that the trailing label there
with no instructions following is indeed not a code bug and the branch
is legitimate.
References:
[1] "MIPS Architecture for Programmers, Volume II-B: The microMIPS32
Instruction Set", MIPS Technologies, Inc., Document Number: MD00582,
Revision 5.04, January 15, 2014, Section 7.1 "Assembly-Level
Compatibility", p. 533
[2] "MIPS Architecture for Programmers, Volume II-B: The microMIPS64
Instruction Set", MIPS Technologies, Inc., Document Number: MD00594,
Revision 5.04, January 15, 2014, Section 8.1 "Assembly-Level
Compatibility", p. 623
2016-11-18 Matthew Fortune <Matthew.Fortune@imgtec.com>
Maciej W. Rozycki <macro@imgtec.com>
* sysdeps/mips/mips32/crti.S (_init): Add `.insn' pseudo-op at
`.Lno_weak_fn' label.
* sysdeps/mips/mips64/n32/crti.S (_init): Likewise.
* sysdeps/mips/mips64/n64/crti.S (_init): Likewise.
2016-11-17 19:15:51 +00:00
|
|
|
.insn
|
2012-02-10 12:28:07 +00:00
|
|
|
#else
|
|
|
|
ld $25,%got_disp(PREINIT_FUNCTION)($28)
|
2016-11-23 12:39:39 +00:00
|
|
|
.reloc 1f,JALR_RELOC,PREINIT_FUNCTION
|
2012-02-10 12:28:07 +00:00
|
|
|
1: jalr $25
|
|
|
|
#endif
|
|
|
|
|
|
|
|
.section .fini,"ax",@progbits
|
|
|
|
.p2align 2
|
|
|
|
.globl _fini
|
2018-06-08 17:28:38 +00:00
|
|
|
.hidden _fini
|
2012-02-10 12:28:07 +00:00
|
|
|
.type _fini, @function
|
|
|
|
_fini:
|
|
|
|
daddiu $sp,$sp,-16
|
|
|
|
sd $28,0($sp)
|
|
|
|
lui $28,%hi(%neg(%gp_rel(_fini)))
|
|
|
|
daddu $28,$28,$25
|
|
|
|
sd $31,8($sp)
|
|
|
|
daddiu $28,$28,%lo(%neg(%gp_rel(_fini)))
|