aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2008-08-20 13:43:32 +0000
committerAlan Modra <amodra@gmail.com>2008-08-20 13:43:32 +0000
commit76d1293995586b060a2dc642a72c877db7092580 (patch)
tree964dd50989ce1a2cd77a00e2bb39114a923e0aef
parentb96e292732664fd8c63970ca11c3a9ac92f60ff9 (diff)
downloadfsf-binutils-gdb-76d1293995586b060a2dc642a72c877db7092580.zip
fsf-binutils-gdb-76d1293995586b060a2dc642a72c877db7092580.tar.gz
fsf-binutils-gdb-76d1293995586b060a2dc642a72c877db7092580.tar.bz2
PR 6848
* write.c (install_reloc): Check that reloc symbols have been written. (set_symtab): Mark symbols with BSF_KEEP.
-rw-r--r--gas/ChangeLog7
-rw-r--r--gas/write.c13
2 files changed, 20 insertions, 0 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 8ba707f..0b2468e 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,10 @@
+2008-08-20 Alan Modra <amodra@bigpond.net.au>
+
+ PR 6848
+ * write.c (install_reloc): Check that reloc symbols have been
+ written.
+ (set_symtab): Mark symbols with BSF_KEEP.
+
2008-08-18 H.J. Lu <hongjiu.lu@intel.com>
* config/tc-i386.c (i386_align_code): Fix a comment typo.
diff --git a/gas/write.c b/gas/write.c
index 660df81..55c757d 100644
--- a/gas/write.c
+++ b/gas/write.c
@@ -1084,6 +1084,15 @@ install_reloc (asection *sec, arelent *reloc, fragS *fragp,
{
char *err;
bfd_reloc_status_type s;
+ asymbol *sym;
+
+ if (reloc->sym_ptr_ptr != NULL
+ && (sym = *reloc->sym_ptr_ptr) != NULL
+ && (sym->flags & BSF_KEEP) == 0
+ && ((sym->flags & BSF_SECTION_SYM) == 0
+ || !EMIT_SECTION_SYMBOLS
+ || !bfd_is_abs_section (sym->section)))
+ as_bad_where (file, line, _("redefined symbol cannot be used on reloc"));
s = bfd_install_relocation (stdoutput, reloc,
fragp->fr_literal, fragp->fr_address,
@@ -1377,6 +1386,10 @@ set_symtab (void)
for (i = 0; i < nsyms; i++, symp = symbol_next (symp))
{
asympp[i] = symbol_get_bfdsym (symp);
+ if (asympp[i]->flags != BSF_SECTION_SYM
+ || !(bfd_is_const_section (asympp[i]->section)
+ && asympp[i]->section->symbol == asympp[i]))
+ asympp[i]->flags |= BSF_KEEP;
symbol_mark_written (symp);
}
}