[Patch mach-o] support LOCAL_SECTDIFF relocs for i386 mach-o.

Iain Sandoe developer@sandoe-acoustics.co.uk
Fri Feb 10 14:39:00 GMT 2012


this is the BFD-side of a patch of Tristan's to support relocs between  
Local symbols in different sections.
... rebased to trunk.

OK?
Iain

bfd:

	* reloc.c (BFD_RELOC_MACH_O_LOCAL_SECTDIFF):
	* libbfd.h: Regenerated.
	* bfd-in2.h: Likewise.
	* mach-o-i386.c (i386_howto_table): Include local sectdiff.
	(bfd_mach_o_i386_swap_reloc_in): Update for local sectdiff.
	(bfd_mach_o_i386_swap_reloc_out): Likewise.

  bfd/bfd-in2.h |    3 +++
  bfd/libbfd.h  |    1 +
  bfd/mach-o-i386.c |   25 ++++++++++++++++++++++---
  bfd/reloc.c       |    4 ++++
  4 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c
index 71272eb..e91e68a 100644
--- a/bfd/mach-o-i386.c
+++ b/bfd/mach-o-i386.c
@@ -63,6 +63,7 @@ bfd_mach_o_i386_mkobject (bfd *abfd)

  static reloc_howto_type i386_howto_table[]=
  {
+  /* 0 */
    HOWTO(BFD_RELOC_32, 0, 2, 32, FALSE, 0,
  	complain_overflow_bitfield,
  	NULL, "32",
@@ -79,6 +80,7 @@ static reloc_howto_type i386_howto_table[]=
  	complain_overflow_bitfield,
  	NULL, "DISP32",
  	FALSE, 0xffffffff, 0xffffffff, TRUE),
+  /* 4 */
    HOWTO(BFD_RELOC_16_PCREL, 0, 1, 16, TRUE, 0,
  	complain_overflow_bitfield,
  	NULL, "DISP16",
@@ -87,6 +89,10 @@ static reloc_howto_type i386_howto_table[]=
  	complain_overflow_bitfield,
  	NULL, "SECTDIFF_32",
  	FALSE, 0xffffffff, 0xffffffff, FALSE),
+  HOWTO(BFD_RELOC_MACH_O_LOCAL_SECTDIFF, 0, 2, 32, FALSE, 0,
+	complain_overflow_bitfield,
+	NULL, "LSECTDIFF_32",
+	FALSE, 0xffffffff, 0xffffffff, FALSE),
    HOWTO(BFD_RELOC_MACH_O_PAIR, 0, 2, 32, FALSE, 0,
  	complain_overflow_bitfield,
  	NULL, "PAIR_32",
@@ -103,15 +109,19 @@ bfd_mach_o_i386_swap_reloc_in (arelent *res,  
bfd_mach_o_reloc_info *reloc)
          case BFD_MACH_O_GENERIC_RELOC_PAIR:
            if (reloc->r_length != 2)
              return FALSE;
-          res->howto = &i386_howto_table[6];
+          res->howto = &i386_howto_table[7];
            res->address = res[-1].address;
            return TRUE;
          case BFD_MACH_O_GENERIC_RELOC_SECTDIFF:
-        case BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF:
            if (reloc->r_length != 2)
              return FALSE;
            res->howto = &i386_howto_table[5];
            return TRUE;
+        case BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF:
+          if (reloc->r_length != 2)
+            return FALSE;
+          res->howto = &i386_howto_table[6];
+          return TRUE;
          default:
            return FALSE;
          }
@@ -183,6 +193,15 @@ bfd_mach_o_i386_swap_reloc_out (arelent *rel,  
bfd_mach_o_reloc_info *rinfo)
        rinfo->r_value = (*rel->sym_ptr_ptr)->value
          + (*rel->sym_ptr_ptr)->section->vma;
        break;
+    case BFD_RELOC_MACH_O_LOCAL_SECTDIFF:
+      rinfo->r_scattered = 1;
+      rinfo->r_type = BFD_MACH_O_GENERIC_RELOC_LOCAL_SECTDIFF;
+      rinfo->r_pcrel = 0;
+      rinfo->r_length = 2;
+      rinfo->r_extern = 0;
+      rinfo->r_value = (*rel->sym_ptr_ptr)->value
+        + (*rel->sym_ptr_ptr)->section->vma;
+      break;
      case BFD_RELOC_MACH_O_PAIR:
        rinfo->r_address = 0;
        rinfo->r_scattered = 1;
diff --git a/bfd/reloc.c b/bfd/reloc.c
index 5cde4a8..778276f 100644
--- a/bfd/reloc.c
+++ b/bfd/reloc.c
@@ -5594,6 +5594,10 @@ ENUMDOC
    Difference between two section addreses.  Must be followed by a
    BFD_RELOC_MACH_O_PAIR.
  ENUM
+  BFD_RELOC_MACH_O_LOCAL_SECTDIFF
+ENUMDOC
+  Like BFD_RELOC_MACH_O_SECTDIFF but with a local symbol.
+ENUM
    BFD_RELOC_MACH_O_PAIR
  ENUMDOC
    Pair of relocation.  Contains the first symbol.



More information about the Binutils mailing list