diff options
Diffstat (limited to 'toolchain/binutils/2.17.50.0.12/320-mips-elf-reloc-regression.patch')
-rw-r--r-- | toolchain/binutils/2.17.50.0.12/320-mips-elf-reloc-regression.patch | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/toolchain/binutils/2.17.50.0.12/320-mips-elf-reloc-regression.patch b/toolchain/binutils/2.17.50.0.12/320-mips-elf-reloc-regression.patch new file mode 100644 index 000000000..902bb8836 --- /dev/null +++ b/toolchain/binutils/2.17.50.0.12/320-mips-elf-reloc-regression.patch @@ -0,0 +1,68 @@ +diff -ur binutils-2.17.50.0.12/bfd/elfxx-mips.c binutils-2.17.50.0.12-patched/bfd/elfxx-mips.c +--- binutils-2.17.50.0.12/bfd/elfxx-mips.c 2006-11-27 16:21:04.000000000 -0600 ++++ binutils-2.17.50.0.12-patched/bfd/elfxx-mips.c 2007-03-20 15:25:42.000000000 -0500 +@@ -3615,7 +3615,6 @@ + } + + /* We didn't find it. */ +- bfd_set_error (bfd_error_bad_value); + return NULL; + } + +@@ -7849,32 +7848,36 @@ + several relocations for the same address. In + that case, the R_MIPS_LO16 relocation may occur + as one of these. We permit a similar extension +- in general, as that is useful for GCC. */ ++ in general, as that is useful for GCC. ++ ++ In some cases GCC dead code elimination removes ++ the LO16 but keeps the corresponding HI16. */ + lo16_relocation = mips_elf_next_relocation (input_bfd, + lo16_type, + rel, relend); +- if (lo16_relocation == NULL) +- return FALSE; +- +- lo16_location = contents + lo16_relocation->r_offset; ++ if (lo16_relocation != NULL) ++ { ++ lo16_location = contents + lo16_relocation->r_offset; + +- /* Obtain the addend kept there. */ +- lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, +- lo16_type, FALSE); +- _bfd_mips16_elf_reloc_unshuffle (input_bfd, lo16_type, FALSE, +- lo16_location); +- l = mips_elf_obtain_contents (lo16_howto, lo16_relocation, +- input_bfd, contents); +- _bfd_mips16_elf_reloc_shuffle (input_bfd, lo16_type, FALSE, +- lo16_location); +- l &= lo16_howto->src_mask; +- l <<= lo16_howto->rightshift; +- l = _bfd_mips_elf_sign_extend (l, 16); ++ /* Obtain the addend kept there. */ ++ lo16_howto = MIPS_ELF_RTYPE_TO_HOWTO (input_bfd, ++ lo16_type, FALSE); ++ _bfd_mips16_elf_reloc_unshuffle (input_bfd, lo16_type, ++ FALSE, lo16_location); ++ l = mips_elf_obtain_contents (lo16_howto, ++ lo16_relocation, ++ input_bfd, contents); ++ _bfd_mips16_elf_reloc_shuffle (input_bfd, lo16_type, ++ FALSE, lo16_location); ++ l &= lo16_howto->src_mask; ++ l <<= lo16_howto->rightshift; ++ l = _bfd_mips_elf_sign_extend (l, 16); + +- addend <<= 16; ++ addend <<= 16; + +- /* Compute the combined addend. */ +- addend += l; ++ /* Compute the combined addend. */ ++ addend += l; ++ } + } + else + addend <<= howto->rightshift; |