This is forward ported version of patch from 2006' elf2flt by
Oskar Schirmer <***@emlix.com>.
Signed-off-by: Max Filippov <***@gmail.com>
Signed-off-by: Waldemar Brodkorb <***@uclibc-ng.org>
---
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 <***@emlix.com>
* (c) 2006 Support the -a (use_resolved) option for TARGET_arm.
* Shaun Jackman <***@gmail.com>
* (c) 2004, Nios II support, Wentao Xu <***@microtronix.com>
@@ -57,6 +58,8 @@ const char *elf2flt_progname;
#include <elf/h8.h> /* 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 <elf/xtensa.h> /* TARGET_* ELF support for the BFD library */
#elif defined(TARGET_microblaze)
#include <elf/microblaze.h> /* 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) ;
@***@_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)
--
1.7.10.4
_______________________________________________
uClinux-dev mailing list
uClinux-***@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-***@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev