188 lines
4.4 KiB
Diff
188 lines
4.4 KiB
Diff
|
--- ../binutils-2.26.orig/bfd/coff-i386.c 2016-02-04 10:31:44.684793142 +0000
|
||
|
+++ bfd/coff-i386.c 2016-02-04 10:32:02.106891045 +0000
|
||
|
@@ -139,41 +139,41 @@ coff_i386_reloc (bfd *abfd,
|
||
|
#define DOIT(x) \
|
||
|
x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
|
||
|
|
||
|
- if (diff != 0)
|
||
|
- {
|
||
|
- reloc_howto_type *howto = reloc_entry->howto;
|
||
|
- unsigned char *addr = (unsigned char *) data + reloc_entry->address;
|
||
|
+ if (diff != 0)
|
||
|
+ {
|
||
|
+ reloc_howto_type *howto = reloc_entry->howto;
|
||
|
+ unsigned char *addr = (unsigned char *) data + reloc_entry->address;
|
||
|
+
|
||
|
+ switch (howto->size)
|
||
|
+ {
|
||
|
+ case 0:
|
||
|
+ {
|
||
|
+ char x = bfd_get_8 (abfd, addr);
|
||
|
+ DOIT (x);
|
||
|
+ bfd_put_8 (abfd, x, addr);
|
||
|
+ }
|
||
|
+ break;
|
||
|
|
||
|
- switch (howto->size)
|
||
|
+ case 1:
|
||
|
{
|
||
|
- case 0:
|
||
|
- {
|
||
|
- char x = bfd_get_8 (abfd, addr);
|
||
|
- DOIT (x);
|
||
|
- bfd_put_8 (abfd, x, addr);
|
||
|
- }
|
||
|
- break;
|
||
|
-
|
||
|
- case 1:
|
||
|
- {
|
||
|
- short x = bfd_get_16 (abfd, addr);
|
||
|
- DOIT (x);
|
||
|
- bfd_put_16 (abfd, (bfd_vma) x, addr);
|
||
|
- }
|
||
|
- break;
|
||
|
-
|
||
|
- case 2:
|
||
|
- {
|
||
|
- long x = bfd_get_32 (abfd, addr);
|
||
|
- DOIT (x);
|
||
|
- bfd_put_32 (abfd, (bfd_vma) x, addr);
|
||
|
- }
|
||
|
- break;
|
||
|
+ short x = bfd_get_16 (abfd, addr);
|
||
|
+ DOIT (x);
|
||
|
+ bfd_put_16 (abfd, (bfd_vma) x, addr);
|
||
|
+ }
|
||
|
+ break;
|
||
|
|
||
|
- default:
|
||
|
- abort ();
|
||
|
+ case 2:
|
||
|
+ {
|
||
|
+ long x = bfd_get_32 (abfd, addr);
|
||
|
+ DOIT (x);
|
||
|
+ bfd_put_32 (abfd, (bfd_vma) x, addr);
|
||
|
}
|
||
|
- }
|
||
|
+ break;
|
||
|
+
|
||
|
+ default:
|
||
|
+ abort ();
|
||
|
+ }
|
||
|
+ }
|
||
|
|
||
|
/* Now let bfd_perform_relocation finish everything up. */
|
||
|
return bfd_reloc_continue;
|
||
|
--- ../binutils-2.26.orig/bfd/coff-x86_64.c 2016-02-04 10:31:44.686793153 +0000
|
||
|
+++ bfd/coff-x86_64.c 2016-02-04 10:33:02.044227862 +0000
|
||
|
@@ -138,59 +138,61 @@ coff_amd64_reloc (bfd *abfd,
|
||
|
#define DOIT(x) \
|
||
|
x = ((x & ~howto->dst_mask) | (((x & howto->src_mask) + diff) & howto->dst_mask))
|
||
|
|
||
|
- if (diff != 0)
|
||
|
- {
|
||
|
- reloc_howto_type *howto = reloc_entry->howto;
|
||
|
- unsigned char *addr = (unsigned char *) data + reloc_entry->address;
|
||
|
-
|
||
|
- /* FIXME: We do not have an end address for data, so we cannot
|
||
|
- accurately range check any addresses computed against it.
|
||
|
- cf: PR binutils/17512: file: 1085-1761-0.004.
|
||
|
- For now we do the best that we can. */
|
||
|
- if (addr < (unsigned char *) data || addr > ((unsigned char *) data) + input_section->size)
|
||
|
+ if (diff != 0)
|
||
|
+ {
|
||
|
+ reloc_howto_type *howto = reloc_entry->howto;
|
||
|
+ unsigned char *addr = (unsigned char *) data + reloc_entry->address;
|
||
|
+
|
||
|
+ /* FIXME: We do not have an end address for data, so we cannot
|
||
|
+ accurately range check any addresses computed against it.
|
||
|
+ cf: PR binutils/17512: file: 1085-1761-0.004.
|
||
|
+ For now we do the best that we can. */
|
||
|
+ if (addr < (unsigned char *) data
|
||
|
+ || addr > ((unsigned char *) data) + input_section->size)
|
||
|
+ {
|
||
|
+ bfd_set_error (bfd_error_bad_value);
|
||
|
+ return bfd_reloc_notsupported;
|
||
|
+ }
|
||
|
+
|
||
|
+ switch (howto->size)
|
||
|
+ {
|
||
|
+ case 0:
|
||
|
{
|
||
|
- bfd_set_error (bfd_error_bad_value);
|
||
|
- return bfd_reloc_notsupported;
|
||
|
+ char x = bfd_get_8 (abfd, addr);
|
||
|
+ DOIT (x);
|
||
|
+ bfd_put_8 (abfd, x, addr);
|
||
|
}
|
||
|
+ break;
|
||
|
|
||
|
- switch (howto->size)
|
||
|
+ case 1:
|
||
|
{
|
||
|
- case 0:
|
||
|
- {
|
||
|
- char x = bfd_get_8 (abfd, addr);
|
||
|
- DOIT (x);
|
||
|
- bfd_put_8 (abfd, x, addr);
|
||
|
- }
|
||
|
- break;
|
||
|
-
|
||
|
- case 1:
|
||
|
- {
|
||
|
- short x = bfd_get_16 (abfd, addr);
|
||
|
- DOIT (x);
|
||
|
- bfd_put_16 (abfd, (bfd_vma) x, addr);
|
||
|
- }
|
||
|
- break;
|
||
|
-
|
||
|
- case 2:
|
||
|
- {
|
||
|
- long x = bfd_get_32 (abfd, addr);
|
||
|
- DOIT (x);
|
||
|
- bfd_put_32 (abfd, (bfd_vma) x, addr);
|
||
|
- }
|
||
|
- break;
|
||
|
- case 4:
|
||
|
- {
|
||
|
- long long x = bfd_get_64 (abfd, addr);
|
||
|
- DOIT (x);
|
||
|
- bfd_put_64 (abfd, (bfd_vma) x, addr);
|
||
|
- }
|
||
|
- break;
|
||
|
-
|
||
|
- default:
|
||
|
- bfd_set_error (bfd_error_bad_value);
|
||
|
- return bfd_reloc_notsupported;
|
||
|
+ short x = bfd_get_16 (abfd, addr);
|
||
|
+ DOIT (x);
|
||
|
+ bfd_put_16 (abfd, (bfd_vma) x, addr);
|
||
|
}
|
||
|
- }
|
||
|
+ break;
|
||
|
+
|
||
|
+ case 2:
|
||
|
+ {
|
||
|
+ long x = bfd_get_32 (abfd, addr);
|
||
|
+ DOIT (x);
|
||
|
+ bfd_put_32 (abfd, (bfd_vma) x, addr);
|
||
|
+ }
|
||
|
+ break;
|
||
|
+
|
||
|
+ case 4:
|
||
|
+ {
|
||
|
+ long long x = bfd_get_64 (abfd, addr);
|
||
|
+ DOIT (x);
|
||
|
+ bfd_put_64 (abfd, (bfd_vma) x, addr);
|
||
|
+ }
|
||
|
+ break;
|
||
|
+
|
||
|
+ default:
|
||
|
+ bfd_set_error (bfd_error_bad_value);
|
||
|
+ return bfd_reloc_notsupported;
|
||
|
+ }
|
||
|
+ }
|
||
|
|
||
|
/* Now let bfd_perform_relocation finish everything up. */
|
||
|
return bfd_reloc_continue;
|