From fe540416272cd7791a82793a395a4cb65f9fce16 Mon Sep 17 00:00:00 2001 From: Sean Keys Date: Thu, 28 Jun 2012 21:36:35 +0000 Subject: [PATCH] gas/config/ * tc-xgate.h: Defined tc_frob_symbol. * tc-xgate.c (xgate_frob_symbol): Wrote new function to mark symbols as being XGATE by setting st_target_internal value. bfd/ * elf32-xgate.c (elf32_xgate_add_symbol_hook): Added a temp patch that forces st_target_internal to equal 1, since tc_frob_symbol seems to need adjusting. --- bfd/elf32-xgate.c | 5 ++++- gas/config/tc-xgate.c | 21 +++++++++++++++++++++ gas/config/tc-xgate.h | 4 ++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/bfd/elf32-xgate.c b/bfd/elf32-xgate.c index bd5ebc476d4..bd62438eff4 100644 --- a/bfd/elf32-xgate.c +++ b/bfd/elf32-xgate.c @@ -529,12 +529,15 @@ stub_hash_newfunc (struct bfd_hash_entry *entry, bfd_boolean elf32_xgate_add_symbol_hook (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info ATTRIBUTE_UNUSED, - Elf_Internal_Sym *sym ATTRIBUTE_UNUSED, + Elf_Internal_Sym *sym, const char **namep ATTRIBUTE_UNUSED, flagword *flagsp ATTRIBUTE_UNUSED, asection **secp ATTRIBUTE_UNUSED, bfd_vma *valp ATTRIBUTE_UNUSED) { + /* For some reason the st_target_internal value is not retained + after xgate_frob_symbol is called, hence this temp hack. */ + sym->st_target_internal = 1; return TRUE; } diff --git a/gas/config/tc-xgate.c b/gas/config/tc-xgate.c index 29089c95707..84bac42ec9c 100644 --- a/gas/config/tc-xgate.c +++ b/gas/config/tc-xgate.c @@ -1410,3 +1410,24 @@ xgate_find_match (struct xgate_opcode_handle *opcode_handle, return NULL; } + +/* Because we are dealing with two different core that view the system + memory with different offsets, we must differentiate what core a + symbol belongs to, in order for the linker to cross-link. */ + +int +xgate_frob_symbol (symbolS *sym) +{ + asymbol *bfdsym; + elf_symbol_type *elfsym; + + bfdsym = symbol_get_bfdsym (sym); + elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym); + + gas_assert(elfsym); + + /* Mark the symbol as being *from XGATE */ + elfsym->internal_elf_sym.st_target_internal = 1; + + return 0; +} diff --git a/gas/config/tc-xgate.h b/gas/config/tc-xgate.h index 7f414e5831c..04349a7e3e0 100644 --- a/gas/config/tc-xgate.h +++ b/gas/config/tc-xgate.h @@ -105,6 +105,10 @@ extern int tc_xgate_fix_adjustable (struct fix *); #define elf_tc_final_processing xgate_elf_final_processing extern void xgate_elf_final_processing (void); +/* Mark the symbol as being from XGATE. */ +#define tc_frob_symbol(sym, punt) punt = xgate_frob_symbol (sym) +extern int xgate_frob_symbol (symbolS *); + #if 0 #define tc_print_statistics(FILE) xgate_print_statistics (FILE) extern void xgate_print_statistics (FILE *); -- 2.30.2