* config/tc-arm.c (arm_fix_adjustable): For COFF, convert fixups against
symbols which are not going to be placed into the symbol table. * coffcode.h (coff_write_relocs): Produce an error message if a an out-of-range symbol index is detected in a reloc.
This commit is contained in:
parent
8c9f705ebb
commit
337ff0a5af
4 changed files with 43 additions and 10 deletions
|
@ -1,3 +1,8 @@
|
|||
2006-05-09 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* coffcode.h (coff_write_relocs): Produce an error message if a an
|
||||
out-of-range symbol index is detected in a reloc.
|
||||
|
||||
2006-05-09 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
* elf64-ppc.c (ppc64_elf_finish_dynamic_symbol): Remove unused
|
||||
|
|
|
@ -2532,11 +2532,15 @@ coff_write_relocs (bfd * abfd, int first_undef)
|
|||
else
|
||||
{
|
||||
n.r_symndx = get_index ((*(q->sym_ptr_ptr)));
|
||||
/* Take notice if the symbol reloc points to a symbol
|
||||
we don't have in our symbol table. What should we
|
||||
do for this?? */
|
||||
/* Check to see if the symbol reloc points to a symbol
|
||||
we don't have in our symbol table. */
|
||||
if (n.r_symndx > obj_conv_table_size (abfd))
|
||||
abort ();
|
||||
{
|
||||
bfd_set_error (bfd_error_bad_value);
|
||||
_bfd_error_handler (_("%B: reloc against a non-existant symbol index: %ld"),
|
||||
abfd, n.r_symndx);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2006-05-09 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* config/tc-arm.c (arm_fix_adjustable): For COFF, convert fixups
|
||||
against symbols which are not going to be placed into the symbol
|
||||
table.
|
||||
|
||||
2006-05-09 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
* expr.c (operand): Remove `if (0 && ..)' statement and
|
||||
|
|
|
@ -17003,17 +17003,35 @@ arm_force_relocation (struct fix * fixp)
|
|||
}
|
||||
|
||||
#ifdef OBJ_COFF
|
||||
/* This is a little hack to help the gas/arm/adrl.s test. It prevents
|
||||
local labels from being added to the output symbol table when they
|
||||
are used with the ADRL pseudo op. The ADRL relocation should always
|
||||
be resolved before the binbary is emitted, so it is safe to say that
|
||||
it is adjustable. */
|
||||
|
||||
bfd_boolean
|
||||
arm_fix_adjustable (fixS * fixP)
|
||||
{
|
||||
/* This is a little hack to help the gas/arm/adrl.s test. It prevents
|
||||
local labels from being added to the output symbol table when they
|
||||
are used with the ADRL pseudo op. The ADRL relocation should always
|
||||
be resolved before the binbary is emitted, so it is safe to say that
|
||||
it is adjustable. */
|
||||
if (fixP->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
|
||||
return 1;
|
||||
|
||||
/* This is a hack for the gas/all/redef2.s test. This test causes symbols
|
||||
to be cloned, and without this test relocs would still be generated
|
||||
against the original pre-cloned symbol. Such symbols would not appear
|
||||
in the symbol table however, and so a valid reloc could not be
|
||||
generated. So check to see if the fixup is against a symbol which has
|
||||
been removed from the symbol chain, and if it is, then allow it to be
|
||||
adjusted into a reloc against a section symbol. */
|
||||
if (fixP->fx_addsy != NULL)
|
||||
{
|
||||
symbolS * sym;
|
||||
|
||||
for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
|
||||
if (sym == fixP->fx_addsy)
|
||||
break;
|
||||
if (sym == NULL)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue