From 052ec62c087a3e9dfb62d231ee4aad253bce2f7e Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Thu, 31 Dec 2015 00:55:48 +0100 Subject: [PATCH] Add xtensa support This is forward ported version of patch from 2006' elf2flt by Oskar Schirmer . Signed-off-by: Max Filippov Signed-off-by: Waldemar Brodkorb Signed-off-by: Greg Ungerer --- elf2flt.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ elf2flt.ld.in | 7 ++++-- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/elf2flt.c b/elf2flt.c index 6134961..fcd797c 100644 --- a/elf2flt.c +++ b/elf2flt.c @@ -6,6 +6,7 @@ * ELF format file handling. Extended relocation support for all of * text and data. * + * (c) 2008-2009, Xtensa support, Oskar Schirmer * (c) 2006 Support the -a (use_resolved) option for TARGET_arm. * Shaun Jackman * (c) 2004, Nios II support, Wentao Xu @@ -57,6 +58,8 @@ const char *elf2flt_progname; #include /* TARGET_* ELF support for the BFD library */ #elif defined(__CYGWIN__) || defined(__MINGW32__) || defined(TARGET_nios) || defined(TARGET_nios2) #include "cygwin-elf.h" /* Cygwin uses a local copy */ +#elif defined(TARGET_xtensa) +#include /* TARGET_* ELF support for the BFD library */ #elif defined(TARGET_microblaze) #include /* TARGET_* ELF support for the BFD library */ #elif defined(TARGET_v850) @@ -110,6 +113,8 @@ const char *elf2flt_progname; #define ARCH "nios" #elif defined(TARGET_nios2) #define ARCH "nios2" +#elif defined(TARGET_xtensa) +#define ARCH "xtensa" #else #error "Don't know how to support your CPU architecture??" #endif @@ -734,6 +739,53 @@ dump_symbols(symbols, number_of_symbols); case R_H8_PCREL8: case R_H8_PCREL16: continue; +#elif defined(TARGET_xtensa) + case R_XTENSA_NONE: + case R_XTENSA_OP0: + case R_XTENSA_OP1: + case R_XTENSA_OP2: + case R_XTENSA_SLOT0_OP: + case R_XTENSA_SLOT1_OP: + case R_XTENSA_SLOT2_OP: + case R_XTENSA_SLOT3_OP: + case R_XTENSA_SLOT4_OP: + case R_XTENSA_SLOT5_OP: + case R_XTENSA_SLOT6_OP: + case R_XTENSA_SLOT7_OP: + case R_XTENSA_SLOT8_OP: + case R_XTENSA_SLOT9_OP: + case R_XTENSA_SLOT10_OP: + case R_XTENSA_SLOT11_OP: + case R_XTENSA_SLOT12_OP: + case R_XTENSA_SLOT13_OP: + case R_XTENSA_SLOT14_OP: + case R_XTENSA_SLOT0_ALT: + case R_XTENSA_SLOT1_ALT: + case R_XTENSA_SLOT2_ALT: + case R_XTENSA_SLOT3_ALT: + case R_XTENSA_SLOT4_ALT: + case R_XTENSA_SLOT5_ALT: + case R_XTENSA_SLOT6_ALT: + case R_XTENSA_SLOT7_ALT: + case R_XTENSA_SLOT8_ALT: + case R_XTENSA_SLOT9_ALT: + case R_XTENSA_SLOT10_ALT: + case R_XTENSA_SLOT11_ALT: + case R_XTENSA_SLOT12_ALT: + case R_XTENSA_SLOT13_ALT: + case R_XTENSA_SLOT14_ALT: + case R_XTENSA_ASM_EXPAND: + case R_XTENSA_ASM_SIMPLIFY: + case R_XTENSA_DIFF8: + case R_XTENSA_DIFF16: + case R_XTENSA_DIFF32: + case R_XTENSA_32_PCREL: + continue; + case R_XTENSA_32: + case R_XTENSA_PLT: + goto good_32bit_resolved_reloc; + default: + goto bad_resolved_reloc; #else default: /* The default is to assume that the @@ -769,6 +821,23 @@ dump_symbols(symbols, number_of_symbols); } } else { /* Calculate the sym address ourselves. */ +#if defined(TARGET_xtensa) + /* For xtensa, calculation of addresses won't + work this way. binutils "ld -r" generate + different relocation types, among others + type 20, R_XTENSA_SLOT0_OP. The latter is + produced for various opcodes that differ + in size and format, some will have the + addend filled in when linking, others won't. + For elf2flt to handle these relocations + would involve analysing the opcodes in + detail. Therefore, elf2flt for xtensa is + patched to work with "-a" option solely, + which will take output of "ld -q". + */ + printf("ERROR: cannot run without '-a'\n"); + exit(1); +#endif sym_reloc_size = bfd_get_reloc_size(q->howto); #if !defined(TARGET_h8300) && !defined(TARGET_e1) && !defined(TARGET_bfin) && !defined(TARGET_m68k) diff --git a/elf2flt.ld.in b/elf2flt.ld.in index 5353413..bfda0ef 100644 --- a/elf2flt.ld.in +++ b/elf2flt.ld.in @@ -16,15 +16,18 @@ SECTIONS { . = . + 4; . = ALIGN(0x4) ; @SYMBOL_PREFIX@_stext = . ; - *(.text) - *(.text.*) + *(.literal .text) + *(.literal.* .text.*) *(.gnu.warning) *(.stub) + *(.gnu.linkonce.literal.*) *(.gnu.linkonce.t*) *(.glue_7t) *(.glue_7) *(.jcr) + *(.init.literal) KEEP (*(.init)) + *(.fini.literal) KEEP (*(.fini)) W_RODAT *(.rodata) -- 2.39.5