mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-01 06:11:35 +08:00
Resync new repository with old repo r5166
git-svn-id: http://svn.code.sf.net/p/nuttx/code/trunk@5153 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
############################################################################
|
||||
# toolchain/nxflat/arm/Makefile
|
||||
#
|
||||
# Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||
# Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name NuttX nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
CFLAGS += -Wall
|
||||
BIN = libarch.a
|
||||
OBJS = disarm.o
|
||||
|
||||
all: $(BIN)
|
||||
|
||||
$(OBJS): %.o: %.c
|
||||
$(CC) -c $(CFLAGS) -o $@ $<
|
||||
|
||||
$(BIN): $(OBJS)
|
||||
$(AR) rcs $@ $<
|
||||
|
||||
clean:
|
||||
rm -f *.o *.a *~ .*.swp core
|
||||
|
||||
@@ -0,0 +1,303 @@
|
||||
/***********************************************************************
|
||||
* xflat/tools/arm/arch.h
|
||||
* ARM thumb2 ELF support for BFD.
|
||||
*
|
||||
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Simply lifted with minimal change from the BFD, binutils 2.19.1:
|
||||
*
|
||||
* Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
|
||||
* Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of BFD, the Binary File Descriptor library.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program 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 General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef _TOOLCHAIN_NXFLAT_ARM_ARCH_H
|
||||
#define _TOOLCHAIN_NXFLAT_ARM_ARCH_H
|
||||
|
||||
#include "reloc-macros.h"
|
||||
|
||||
/* Inform ldnxflat that this is 32-bit ARM code */
|
||||
|
||||
#define NXFLAT_ARM 1
|
||||
#undef NXFLAT_THUMB2
|
||||
|
||||
/* Processor specific flags for the ELF header e_flags field. */
|
||||
#define EF_ARM_RELEXEC 0x01
|
||||
#define EF_ARM_HASENTRY 0x02
|
||||
#define EF_ARM_INTERWORK 0x04
|
||||
#define EF_ARM_APCS_26 0x08
|
||||
#define EF_ARM_APCS_FLOAT 0x10
|
||||
#define EF_ARM_PIC 0x20
|
||||
#define EF_ARM_ALIGN8 0x40 /* 8-bit structure alignment is in use. */
|
||||
#define EF_ARM_NEW_ABI 0x80
|
||||
#define EF_ARM_OLD_ABI 0x100
|
||||
#define EF_ARM_SOFT_FLOAT 0x200
|
||||
#define EF_ARM_VFP_FLOAT 0x400
|
||||
#define EF_ARM_MAVERICK_FLOAT 0x800
|
||||
|
||||
/* Frame unwind information */
|
||||
#define PT_ARM_EXIDX (PT_LOPROC + 1)
|
||||
|
||||
/* Other constants defined in the ARM ELF spec. version B-01. */
|
||||
#define EF_ARM_SYMSARESORTED 0x04 /* NB conflicts with EF_INTERWORK */
|
||||
#define EF_ARM_DYNSYMSUSESEGIDX 0x08 /* NB conflicts with EF_APCS26 */
|
||||
#define EF_ARM_MAPSYMSFIRST 0x10 /* NB conflicts with EF_APCS_FLOAT */
|
||||
#define EF_ARM_EABIMASK 0xFF000000
|
||||
|
||||
/* Constants defined in AAELF. */
|
||||
#define EF_ARM_BE8 0x00800000
|
||||
#define EF_ARM_LE8 0x00400000
|
||||
|
||||
#define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
|
||||
#define EF_ARM_EABI_UNKNOWN 0x00000000
|
||||
#define EF_ARM_EABI_VER1 0x01000000
|
||||
#define EF_ARM_EABI_VER2 0x02000000
|
||||
#define EF_ARM_EABI_VER3 0x03000000
|
||||
#define EF_ARM_EABI_VER4 0x04000000
|
||||
#define EF_ARM_EABI_VER5 0x05000000
|
||||
|
||||
/* Local aliases for some flags to match names used by COFF port. */
|
||||
#define F_INTERWORK EF_ARM_INTERWORK
|
||||
#define F_APCS26 EF_ARM_APCS_26
|
||||
#define F_APCS_FLOAT EF_ARM_APCS_FLOAT
|
||||
#define F_PIC EF_ARM_PIC
|
||||
#define F_SOFT_FLOAT EF_ARM_SOFT_FLOAT
|
||||
#define F_VFP_FLOAT EF_ARM_VFP_FLOAT
|
||||
|
||||
/* Additional symbol types for Thumb. */
|
||||
#define STT_ARM_TFUNC 13 /* A Thumb function. */
|
||||
#define STT_ARM_16BIT 15 /* A Thumb label. */
|
||||
|
||||
/* Additional section types. */
|
||||
#define SHT_ARM_EXIDX 0x70000001 /* Section holds ARM unwind info. */
|
||||
#define SHT_ARM_PREEMPTMAP 0x70000002 /* Section pre-emption details. */
|
||||
#define SHT_ARM_ATTRIBUTES 0x70000003 /* Section holds attributes. */
|
||||
|
||||
/* ARM-specific values for sh_flags. */
|
||||
#define SHF_ENTRYSECT 0x10000000 /* Section contains an entry point. */
|
||||
#define SHF_COMDEF 0x80000000 /* Section may be multiply defined in the input to a link step. */
|
||||
|
||||
/* ARM-specific program header flags. */
|
||||
#define PF_ARM_SB 0x10000000 /* Segment contains the location addressed by the static base. */
|
||||
#define PF_ARM_PI 0x20000000 /* Segment is position-independent. */
|
||||
#define PF_ARM_ABS 0x40000000 /* Segment must be loaded at its base address. */
|
||||
|
||||
/* Values for the Tag_CPU_arch EABI attribute. */
|
||||
#define TAG_CPU_ARCH_PRE_V4 0
|
||||
#define TAG_CPU_ARCH_V4 1
|
||||
#define TAG_CPU_ARCH_V4T 2
|
||||
#define TAG_CPU_ARCH_V5T 3
|
||||
#define TAG_CPU_ARCH_V5TE 4
|
||||
#define TAG_CPU_ARCH_V5TEJ 5
|
||||
#define TAG_CPU_ARCH_V6 6
|
||||
#define TAG_CPU_ARCH_V6KZ 7
|
||||
#define TAG_CPU_ARCH_V6T2 8
|
||||
#define TAG_CPU_ARCH_V6K 9
|
||||
#define TAG_CPU_ARCH_V7 10
|
||||
|
||||
/* Relocation types. */
|
||||
|
||||
START_RELOC_NUMBERS (elf_arm_reloc_type)
|
||||
/* AAELF official names and numbers. */
|
||||
RELOC_NUMBER (R_ARM_NONE, 0)
|
||||
RELOC_NUMBER (R_ARM_PC24, 1) /* deprecated */
|
||||
RELOC_NUMBER (R_ARM_ABS32, 2)
|
||||
RELOC_NUMBER (R_ARM_REL32, 3)
|
||||
RELOC_NUMBER (R_ARM_LDR_PC_G0, 4)
|
||||
RELOC_NUMBER (R_ARM_ABS16, 5)
|
||||
RELOC_NUMBER (R_ARM_ABS12, 6)
|
||||
RELOC_NUMBER (R_ARM_THM_ABS5, 7)
|
||||
RELOC_NUMBER (R_ARM_ABS8, 8)
|
||||
RELOC_NUMBER (R_ARM_SBREL32, 9)
|
||||
RELOC_NUMBER (R_ARM_THM_CALL, 10)
|
||||
RELOC_NUMBER (R_ARM_THM_PC8, 11)
|
||||
RELOC_NUMBER (R_ARM_BREL_ADJ, 12)
|
||||
RELOC_NUMBER (R_ARM_SWI24, 13) /* obsolete */
|
||||
RELOC_NUMBER (R_ARM_THM_SWI8, 14) /* obsolete */
|
||||
RELOC_NUMBER (R_ARM_XPC25, 15) /* obsolete */
|
||||
RELOC_NUMBER (R_ARM_THM_XPC22, 16) /* obsolete */
|
||||
RELOC_NUMBER (R_ARM_TLS_DTPMOD32, 17)
|
||||
RELOC_NUMBER (R_ARM_TLS_DTPOFF32, 18)
|
||||
RELOC_NUMBER (R_ARM_TLS_TPOFF32, 19)
|
||||
RELOC_NUMBER (R_ARM_COPY, 20) /* Copy symbol at runtime. */
|
||||
RELOC_NUMBER (R_ARM_GLOB_DAT, 21) /* Create GOT entry. */
|
||||
RELOC_NUMBER (R_ARM_JUMP_SLOT, 22) /* Create PLT entry. */
|
||||
RELOC_NUMBER (R_ARM_RELATIVE, 23) /* Adjust by program base. */
|
||||
RELOC_NUMBER (R_ARM_GOTOFF32, 24) /* 32 bit offset to GOT. */
|
||||
RELOC_NUMBER (R_ARM_BASE_PREL, 25) /* 32 bit PC relative offset to GOT. */
|
||||
RELOC_NUMBER (R_ARM_GOT_BREL, 26) /* 32 bit GOT entry. */
|
||||
RELOC_NUMBER (R_ARM_PLT32, 27) /* deprecated - 32 bit PLT address. */
|
||||
RELOC_NUMBER (R_ARM_CALL, 28)
|
||||
RELOC_NUMBER (R_ARM_JUMP24, 29)
|
||||
RELOC_NUMBER (R_ARM_THM_JUMP24, 30)
|
||||
RELOC_NUMBER (R_ARM_BASE_ABS, 31)
|
||||
RELOC_NUMBER (R_ARM_ALU_PCREL7_0, 32) /* obsolete */
|
||||
RELOC_NUMBER (R_ARM_ALU_PCREL15_8, 33) /* obsolete */
|
||||
RELOC_NUMBER (R_ARM_ALU_PCREL23_15, 34) /* obsolete */
|
||||
RELOC_NUMBER (R_ARM_LDR_SBREL_11_0, 35) /* deprecated, should have _NC suffix */
|
||||
RELOC_NUMBER (R_ARM_ALU_SBREL_19_12, 36) /* deprecated, should have _NC suffix */
|
||||
RELOC_NUMBER (R_ARM_ALU_SBREL_27_20, 37) /* deprecated, should have _CK suffix */
|
||||
RELOC_NUMBER (R_ARM_TARGET1, 38)
|
||||
RELOC_NUMBER (R_ARM_SBREL31, 39) /* deprecated */
|
||||
RELOC_NUMBER (R_ARM_V4BX, 40)
|
||||
RELOC_NUMBER (R_ARM_TARGET2, 41)
|
||||
RELOC_NUMBER (R_ARM_PREL31, 42)
|
||||
RELOC_NUMBER (R_ARM_MOVW_ABS_NC, 43)
|
||||
RELOC_NUMBER (R_ARM_MOVT_ABS, 44)
|
||||
RELOC_NUMBER (R_ARM_MOVW_PREL_NC, 45)
|
||||
RELOC_NUMBER (R_ARM_MOVT_PREL, 46)
|
||||
RELOC_NUMBER (R_ARM_THM_MOVW_ABS_NC, 47)
|
||||
RELOC_NUMBER (R_ARM_THM_MOVT_ABS, 48)
|
||||
RELOC_NUMBER (R_ARM_THM_MOVW_PREL_NC, 49)
|
||||
RELOC_NUMBER (R_ARM_THM_MOVT_PREL, 50)
|
||||
RELOC_NUMBER (R_ARM_THM_JUMP19, 51)
|
||||
RELOC_NUMBER (R_ARM_THM_JUMP6, 52)
|
||||
RELOC_NUMBER (R_ARM_THM_ALU_PREL_11_0, 53)
|
||||
RELOC_NUMBER (R_ARM_THM_PC12, 54)
|
||||
RELOC_NUMBER (R_ARM_ABS32_NOI, 55)
|
||||
RELOC_NUMBER (R_ARM_REL32_NOI, 56)
|
||||
RELOC_NUMBER (R_ARM_ALU_PC_G0_NC, 57)
|
||||
RELOC_NUMBER (R_ARM_ALU_PC_G0, 58)
|
||||
RELOC_NUMBER (R_ARM_ALU_PC_G1_NC, 59)
|
||||
RELOC_NUMBER (R_ARM_ALU_PC_G1, 60)
|
||||
RELOC_NUMBER (R_ARM_ALU_PC_G2, 61)
|
||||
RELOC_NUMBER (R_ARM_LDR_PC_G1, 62)
|
||||
RELOC_NUMBER (R_ARM_LDR_PC_G2, 63)
|
||||
RELOC_NUMBER (R_ARM_LDRS_PC_G0, 64)
|
||||
RELOC_NUMBER (R_ARM_LDRS_PC_G1, 65)
|
||||
RELOC_NUMBER (R_ARM_LDRS_PC_G2, 66)
|
||||
RELOC_NUMBER (R_ARM_LDC_PC_G0, 67)
|
||||
RELOC_NUMBER (R_ARM_LDC_PC_G1, 68)
|
||||
RELOC_NUMBER (R_ARM_LDC_PC_G2, 69)
|
||||
RELOC_NUMBER (R_ARM_ALU_SB_G0_NC, 70)
|
||||
RELOC_NUMBER (R_ARM_ALU_SB_G0, 71)
|
||||
RELOC_NUMBER (R_ARM_ALU_SB_G1_NC, 72)
|
||||
RELOC_NUMBER (R_ARM_ALU_SB_G1, 73)
|
||||
RELOC_NUMBER (R_ARM_ALU_SB_G2, 74)
|
||||
RELOC_NUMBER (R_ARM_LDR_SB_G0, 75)
|
||||
RELOC_NUMBER (R_ARM_LDR_SB_G1, 76)
|
||||
RELOC_NUMBER (R_ARM_LDR_SB_G2, 77)
|
||||
RELOC_NUMBER (R_ARM_LDRS_SB_G0, 78)
|
||||
RELOC_NUMBER (R_ARM_LDRS_SB_G1, 79)
|
||||
RELOC_NUMBER (R_ARM_LDRS_SB_G2, 80)
|
||||
RELOC_NUMBER (R_ARM_LDC_SB_G0, 81)
|
||||
RELOC_NUMBER (R_ARM_LDC_SB_G1, 82)
|
||||
RELOC_NUMBER (R_ARM_LDC_SB_G2, 83)
|
||||
RELOC_NUMBER (R_ARM_MOVW_BREL_NC, 84)
|
||||
RELOC_NUMBER (R_ARM_MOVT_BREL, 85)
|
||||
RELOC_NUMBER (R_ARM_MOVW_BREL, 86)
|
||||
RELOC_NUMBER (R_ARM_THM_MOVW_BREL_NC, 87)
|
||||
RELOC_NUMBER (R_ARM_THM_MOVT_BREL, 88)
|
||||
RELOC_NUMBER (R_ARM_THM_MOVW_BREL, 89)
|
||||
/* 90-93 unallocated */
|
||||
RELOC_NUMBER (R_ARM_PLT32_ABS, 94)
|
||||
RELOC_NUMBER (R_ARM_GOT_ABS, 95)
|
||||
RELOC_NUMBER (R_ARM_GOT_PREL, 96)
|
||||
RELOC_NUMBER (R_ARM_GOT_BREL12, 97)
|
||||
RELOC_NUMBER (R_ARM_GOTOFF12, 98)
|
||||
RELOC_NUMBER (R_ARM_GOTRELAX, 99)
|
||||
RELOC_NUMBER (R_ARM_GNU_VTENTRY, 100) /* deprecated - old C++ abi */
|
||||
RELOC_NUMBER (R_ARM_GNU_VTINHERIT, 101) /* deprecated - old C++ abi */
|
||||
RELOC_NUMBER (R_ARM_THM_JUMP11, 102)
|
||||
RELOC_NUMBER (R_ARM_THM_JUMP8, 103)
|
||||
RELOC_NUMBER (R_ARM_TLS_GD32, 104)
|
||||
RELOC_NUMBER (R_ARM_TLS_LDM32, 105)
|
||||
RELOC_NUMBER (R_ARM_TLS_LDO32, 106)
|
||||
RELOC_NUMBER (R_ARM_TLS_IE32, 107)
|
||||
RELOC_NUMBER (R_ARM_TLS_LE32, 108)
|
||||
RELOC_NUMBER (R_ARM_TLS_LDO12, 109)
|
||||
RELOC_NUMBER (R_ARM_TLS_LE12, 110)
|
||||
RELOC_NUMBER (R_ARM_TLS_IE12GP, 111)
|
||||
/* 112 - 127 private range */
|
||||
RELOC_NUMBER (R_ARM_ME_TOO, 128) /* obsolete */
|
||||
|
||||
/* Extensions? R=read-only? */
|
||||
RELOC_NUMBER (R_ARM_RXPC25, 249)
|
||||
RELOC_NUMBER (R_ARM_RSBREL32, 250)
|
||||
RELOC_NUMBER (R_ARM_THM_RPC22, 251)
|
||||
RELOC_NUMBER (R_ARM_RREL32, 252)
|
||||
RELOC_NUMBER (R_ARM_RABS32, 253)
|
||||
RELOC_NUMBER (R_ARM_RPC24, 254)
|
||||
RELOC_NUMBER (R_ARM_RBASE, 255)
|
||||
|
||||
/* Unofficial names for some of the relocs. */
|
||||
FAKE_RELOC (R_ARM_GOTOFF, R_ARM_GOTOFF32) /* 32 bit offset to GOT. */
|
||||
FAKE_RELOC (R_ARM_THM_PC22, R_ARM_THM_CALL)
|
||||
FAKE_RELOC (R_ARM_THM_PC11, R_ARM_THM_JUMP11)
|
||||
FAKE_RELOC (R_ARM_THM_PC9, R_ARM_THM_JUMP8)
|
||||
|
||||
/* Relocs with both a different name, and (apparently) different meaning in
|
||||
GNU usage. */
|
||||
FAKE_RELOC (R_ARM_GOTPC, R_ARM_BASE_PREL) /* 32 bit PC relative offset to GOT. */
|
||||
FAKE_RELOC (R_ARM_GOT32, R_ARM_GOT_BREL) /* 32 bit GOT entry. */
|
||||
FAKE_RELOC (R_ARM_ROSEGREL32, R_ARM_SBREL31) /* ??? */
|
||||
FAKE_RELOC (R_ARM_AMP_VCALL9, R_ARM_BREL_ADJ) /* Thumb-something. Not used. */
|
||||
|
||||
END_RELOC_NUMBERS (R_ARM_max = 256)
|
||||
|
||||
#ifdef BFD_ARCH_SIZE
|
||||
/* EABI object attributes. */
|
||||
|
||||
enum
|
||||
{
|
||||
/* 0-3 are generic. */
|
||||
Tag_CPU_raw_name = 4,
|
||||
Tag_CPU_name,
|
||||
Tag_CPU_arch,
|
||||
Tag_CPU_arch_profile,
|
||||
Tag_ARM_ISA_use,
|
||||
Tag_THUMB_ISA_use,
|
||||
Tag_VFP_arch,
|
||||
Tag_WMMX_arch,
|
||||
Tag_NEON_arch,
|
||||
Tag_PCS_config,
|
||||
Tag_ABI_PCS_R9_use,
|
||||
Tag_ABI_PCS_RW_data,
|
||||
Tag_ABI_PCS_RO_data,
|
||||
Tag_ABI_PCS_GOT_use,
|
||||
Tag_ABI_PCS_wchar_t,
|
||||
Tag_ABI_FP_rounding,
|
||||
Tag_ABI_FP_denormal,
|
||||
Tag_ABI_FP_exceptions,
|
||||
Tag_ABI_FP_user_exceptions,
|
||||
Tag_ABI_FP_number_model,
|
||||
Tag_ABI_align8_needed,
|
||||
Tag_ABI_align8_preserved,
|
||||
Tag_ABI_enum_size,
|
||||
Tag_ABI_HardFP_use,
|
||||
Tag_ABI_VFP_args,
|
||||
Tag_ABI_WMMX_args,
|
||||
Tag_ABI_optimization_goals,
|
||||
Tag_ABI_FP_optimization_goals,
|
||||
/* 32 is generic. */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* The name of the note section used to identify arm variants. */
|
||||
#define ARM_NOTE_SECTION ".note.gnu.arm.ident"
|
||||
|
||||
/* Special section names. */
|
||||
#define ELF_STRING_ARM_unwind ".ARM.exidx"
|
||||
#define ELF_STRING_ARM_unwind_info ".ARM.extab"
|
||||
#define ELF_STRING_ARM_unwind_once ".gnu.linkonce.armexidx."
|
||||
#define ELF_STRING_ARM_unwind_info_once ".gnu.linkonce.armextab."
|
||||
|
||||
#endif /* _TOOLCHAIN_NXFLAT_ARM_ARCH_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,216 @@
|
||||
/***********************************************************************
|
||||
* toolchain/nxflat/arm/dyncall_skeleton.def
|
||||
*
|
||||
* Copyright (C) 2009 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
/*******************************************************************
|
||||
* File Prologue
|
||||
*******************************************************************/
|
||||
|
||||
static const char file_prologue[] =
|
||||
"/*******************************************************************\n"
|
||||
" *\n"
|
||||
" * This file contains the dynamic call logic that performs the thunk\n"
|
||||
" * for outound calls from one module to another.\n"
|
||||
" *\n"
|
||||
" * ARM register quick reference:\n"
|
||||
" *\n"
|
||||
" * Name Number ARM Procedure Calling Standard Role\n"
|
||||
" *\n"
|
||||
" * a1 r0 argument 1/integer result/scratch register/argc\n"
|
||||
" * a2 r1 argument 2/scratch register/argv\n"
|
||||
" * a3 r2 argument 3/scratch register/envp\n"
|
||||
" * a4 r3 argument 4/scratch register\n"
|
||||
" * v1 r4 register variable\n"
|
||||
" * v2 r5 register variable\n"
|
||||
" * v3 r6 register variable\n"
|
||||
" * v4 r7 register variable\n"
|
||||
" * v5 r8 register variable\n"
|
||||
" * sb/v6 r9 static base/register variable\n"
|
||||
" * sl/v7 r10 stack limit/stack chunk handle/reg. variable\n"
|
||||
" * fp r11 frame pointer\n"
|
||||
" * ip r12 scratch register/new-sb in inter-link-unit calls\n"
|
||||
" * sp r13 lower end of current stack frame\n"
|
||||
" * lr r14 link address/scratch register\n"
|
||||
" * pc r15 program counter\n"
|
||||
" *******************************************************************/\n\n"
|
||||
"/*******************************************************************\n"
|
||||
" * Included Files\n"
|
||||
" *******************************************************************/\n\n"
|
||||
"/*******************************************************************\n"
|
||||
" * Definitions\n"
|
||||
" *******************************************************************/\n";
|
||||
|
||||
static const char import_prologue[] = "";
|
||||
|
||||
/*******************************************************************
|
||||
* Import Function Name String Table
|
||||
*******************************************************************/
|
||||
|
||||
static const char import_name_strtab_prologue[] =
|
||||
"\n/*******************************************************************\n"
|
||||
" * Import Function Names\n"
|
||||
" *******************************************************************/\n\n"
|
||||
"/* These are the names of all of the functions that are imported.\n"
|
||||
" * Notice that all data associated with the library names is retained\n"
|
||||
" * in the .text section."
|
||||
" */\n\n"
|
||||
"\t.text\n"
|
||||
"\t.align\t0\n";
|
||||
|
||||
#define MKIMPSTRTABARG(fn,i) (i), (i), (i), (fn), (i), (i)
|
||||
|
||||
static const char import_name_strtab_format[] =
|
||||
"\n\t.local\t__dynimport%04d\n"
|
||||
"\t.type\t__dynimport%04d, object\n\n"
|
||||
"__dynimport%04d:\n"
|
||||
"\t.asciz\t\"%s\"\n"
|
||||
"\t.size\t__dynimport%04d, .-__dynimport%04d\n";
|
||||
|
||||
/*******************************************************************
|
||||
* Dyanamic Call Information
|
||||
*******************************************************************/
|
||||
|
||||
static const char dynimport_decl_prologue[] =
|
||||
"\n/*******************************************************************\n"
|
||||
" * Imported Symbol Table (an array of type struct flat_import)\n"
|
||||
" *******************************************************************/\n\n"
|
||||
"/* Notice that, unlike most other arrays in this file, this array\n"
|
||||
" * is declared to reside in .data. Because of this, there will be\n"
|
||||
" * per-process instances of this table.\n"
|
||||
" */\n\n"
|
||||
"\t.data\n"
|
||||
"\t.align\t2\n\n"
|
||||
"\t.global\t__dynimport_begin\n"
|
||||
"\t.type\t__dynimport_begin, object\n"
|
||||
"\t.global\t__dynimport_end\n"
|
||||
"\t.type\t__dynimport_end, object\n\n";
|
||||
|
||||
#define MKINFODECLARGS(fn, i) (i), (fn), (i)
|
||||
|
||||
static const char dynimport_decl_format[] =
|
||||
"\t.local\t__dyninfo%04d\t/* Dynamic info for imported symbol %s */\n"
|
||||
"\t.type\t__dyninfo%04d, object\n";
|
||||
|
||||
static const char dynimport_array_prologue[] =
|
||||
"\n__dynimport_begin:\n";
|
||||
|
||||
#define MKINFOARGS(fn, i) (i), (fn), (i), (i), (i)
|
||||
|
||||
static const char dynimport_array_format[] =
|
||||
"__dyninfo%04d:\t\t\t/* Dynamic info for imported symbol %s */\n"
|
||||
"\t.word\t__dynimport%04d\t/* Offset to name of imported function */\n"
|
||||
"\t.word\t0\t\t/* Resolved address of imported function */\n"
|
||||
"\t.size\t__dyninfo%04d, .-__dyninfo%04d\n";
|
||||
|
||||
static const char dynimport_array_epilogue[] =
|
||||
"__dynimport_end:\n"
|
||||
"\t.size\t__dynimport_begin, __dynimport_end-__dynimport_begin\n";
|
||||
|
||||
static const char dyncall_decl_prologue[] =
|
||||
"\n/*******************************************************************\n"
|
||||
" * Dynamic Call Logic\n"
|
||||
" *******************************************************************/\n\n"
|
||||
"\t.text\n"
|
||||
"\t.align\t2\n";
|
||||
|
||||
#define MKCALLARGS(fn, i) (fn), (fn), (fn), (fn), (i), (i), (i), (fn), (fn)
|
||||
|
||||
#ifndef __NO_GOT__
|
||||
|
||||
static const char dyncall_format[] =
|
||||
"\n/* Dynamic call logic for imported symbol %s */\n\n"
|
||||
"\t.global\t%s\n"
|
||||
"\t.type\t%s, function\n\n"
|
||||
"%s:\n"
|
||||
"\tldr\tip,.Ldyn%04d\n"
|
||||
"\tadd\tip,ip,sl\n"
|
||||
"\tldr\tip,[ip,#4]\n"
|
||||
"\tbx\tip\n"
|
||||
".Ldyn%04d:\n"
|
||||
"\t.word\t__dyninfo%04d(GOTOFF)\n"
|
||||
"\t.size\t%s, .-%s\n";
|
||||
|
||||
static const char nonreturning_dyncall_format[] =
|
||||
"\n/* Dynamic call logic for imported, non-returning symbol %s */\n\n"
|
||||
"\t.global\t%s\n"
|
||||
"\t.type\t%s, function\n\n"
|
||||
"%s:\n"
|
||||
"\tldr\tip,.Ldyn%04d\n"
|
||||
"\tadd\tip,ip,sl\n"
|
||||
"\tldr\tip,[ip,#4]\n"
|
||||
"\tbx\tip\n"
|
||||
".Ldyn%04d:\n"
|
||||
"\t.word\t__dyninfo%04d(GOTOFF)\n"
|
||||
"\t.size\t%s, .-%s\n";
|
||||
|
||||
#else
|
||||
|
||||
static const char dyncall_format[] =
|
||||
"\n/* Dynamic call logic for imported symbol %s */\n\n"
|
||||
"\t.global\t%s\n"
|
||||
"\t.type\t%s, function\n\n"
|
||||
"%s:\n"
|
||||
"\tldr\tip,.Ldyn%04d\n"
|
||||
"\tadd\tip,ip,sl\n"
|
||||
"\tldr\tip,[ip,#4]\n"
|
||||
"\tbx\tip\n"
|
||||
".Ldyn%04d:\n"
|
||||
"\t.word\t__dyninfo%04d\n"
|
||||
"\t.size\t%s, .-%s\n";
|
||||
|
||||
static const char nonreturning_dyncall_format[] =
|
||||
"\n/* Dynamic call logic for imported, non-returning symbol %s */\n\n"
|
||||
"\t.global\t%s\n"
|
||||
"\t.type\t%s, function\n\n"
|
||||
"%s:\n"
|
||||
"\tldr\tip,.Ldyn%04d\n"
|
||||
"\tadd\tip,ip,sl\n"
|
||||
"\tldr\tip,[ip,#4]\n"
|
||||
"\tbx\tip\n"
|
||||
".Ldyn%04d:\n"
|
||||
"\t.word\t__dyninfo%04d\n"
|
||||
"\t.size\t%s, .-%s\n";
|
||||
|
||||
#endif
|
||||
|
||||
/*******************************************************************
|
||||
* File Epilogue
|
||||
*******************************************************************/
|
||||
|
||||
static const char file_epilogue[] =
|
||||
"\t.end\n";
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user