diff options
author | Ken Raeburn <raeburn@cygnus> | 1993-08-05 18:24:21 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@cygnus> | 1993-08-05 18:24:21 +0000 |
commit | a49880c83d6d55cdbc6a7295b71477013b87d37a (patch) | |
tree | aea6da93e4464c8127a6b374ef317de19eda8851 /bfd | |
parent | 15db204498581dbb232ed7d82a2a4c5b1ad3ad5f (diff) | |
download | gdb-a49880c83d6d55cdbc6a7295b71477013b87d37a.zip gdb-a49880c83d6d55cdbc6a7295b71477013b87d37a.tar.gz gdb-a49880c83d6d55cdbc6a7295b71477013b87d37a.tar.bz2 |
add i386-elf relocs (from Meissner)
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/reloc.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/bfd/reloc.c b/bfd/reloc.c index c2df4b7..acce99e 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -579,7 +579,9 @@ DEFUN(bfd_perform_relocation,(abfd, might have overflowed before we get here. For a correct check we need to compute the value in a size larger than bitsize, but we can't reasonably do that for a reloc the same size as a host - machine word. */ + machine word. + FIXME: We should also do overflow checking on the result after + adding in the value contained in the object file. */ if (howto->complain_on_overflow != complain_overflow_dont) { bfd_vma check; @@ -631,7 +633,22 @@ DEFUN(bfd_perform_relocation,(abfd, if (((bfd_vma) check &~ reloc_bits) != 0 && ((bfd_vma) check &~ reloc_bits) != (-1 &~ reloc_bits)) - flag = bfd_reloc_overflow; + { + /* The above right shift is incorrect for a signed + value. See if turning on the upper bits fixes the + overflow. */ + if (howto->rightshift > howto->bitpos + && (bfd_signed_vma) relocation < 0) + { + check |= ((bfd_vma) -1 + &~ ((bfd_vma) -1 + >> (howto->rightshift - howto->bitpos))); + if (((bfd_vma) check &~ reloc_bits) != (-1 &~ reloc_bits)) + flag = bfd_reloc_overflow; + } + else + flag = bfd_reloc_overflow; + } } break; default: @@ -962,6 +979,16 @@ CODE_FRAGMENT . BFD_RELOC_HPPA_UNWIND_ENTRY, . BFD_RELOC_HPPA_UNWIND_ENTRIES, . +. {* i386/elf relocations *} +. BFD_RELOC_386_GOT32, +. BFD_RELOC_386_PLT32, +. BFD_RELOC_386_COPY, +. BFD_RELOC_386_GLOB_DAT, +. BFD_RELOC_386_JUMP_SLOT, +. BFD_RELOC_386_RELATIVE, +. BFD_RELOC_386_GOTOFF, +. BFD_RELOC_386_GOTPC, +. . {* this must be the highest numeric value *} . BFD_RELOC_UNUSED . } bfd_reloc_code_real_type; |