bfd/
authorRichard Sandiford <rdsandiford@googlemail.com>
Sun, 13 Oct 2013 10:03:22 +0000 (10:03 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Sun, 13 Oct 2013 10:03:22 +0000 (10:03 +0000)
* elfxx-mips.c (mips_use_local_got_p): New function.
(mips_elf_count_got_symbols, mips_elf_calculate_relocation): Use it.
(_bfd_mips_elf_check_relocs): Set pointer_equality_needed for
GOT and absolute references.

ld/testsuite/
* ld-mips-elf/pic-and-nonpic-6-n32.ad,
ld-mips-elf/pic-and-nonpic-6-n32.dd,
ld-mips-elf/pic-and-nonpic-6-n32.gd,
ld-mips-elf/pic-and-nonpic-6-n32.nd,
ld-mips-elf/pic-and-nonpic-6-n32.rd,
ld-mips-elf/pic-and-nonpic-6-n64.ad,
ld-mips-elf/pic-and-nonpic-6-n64.dd,
ld-mips-elf/pic-and-nonpic-6-n64.gd,
ld-mips-elf/pic-and-nonpic-6-n64.nd,
ld-mips-elf/pic-and-nonpic-6-n64.rd,
ld-mips-elf/pic-and-nonpic-6-o32.ad,
ld-mips-elf/pic-and-nonpic-6-o32.dd,
ld-mips-elf/pic-and-nonpic-6-o32.gd,
ld-mips-elf/pic-and-nonpic-6-o32.nd,
ld-mips-elf/pic-and-nonpic-6-o32.rd: Fix symbol value of extf4.
No longer expect extf3, extf4 and extd2 to be in the global GOT.

18 files changed:
bfd/ChangeLog
bfd/elfxx-mips.c
ld/testsuite/ChangeLog
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.ad
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.dd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.gd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.nd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n32.rd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.ad
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.dd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.gd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.nd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-n64.rd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.ad
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.dd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.gd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.nd
ld/testsuite/ld-mips-elf/pic-and-nonpic-6-o32.rd

index e51180d..f7cc20f 100644 (file)
@@ -1,3 +1,10 @@
+2013-10-13  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * elfxx-mips.c (mips_use_local_got_p): New function.
+       (mips_elf_count_got_symbols, mips_elf_calculate_relocation): Use it.
+       (_bfd_mips_elf_check_relocs): Set pointer_equality_needed for
+       GOT and absolute references.
+
 2013-10-09  Roland McGrath  <mcgrathr@google.com>
 
        * elf64-alpha.c (elf64_alpha_relax_tls_get_addr): Cast switch
index d7498e1..b443876 100644 (file)
@@ -4299,6 +4299,36 @@ mips_elf_resolve_final_got_entries (struct bfd_link_info *info,
   return TRUE;
 }
 
+/* Return true if a GOT entry for H should live in the local rather than
+   global GOT area.  */
+
+static bfd_boolean
+mips_use_local_got_p (struct bfd_link_info *info,
+                     struct mips_elf_link_hash_entry *h)
+{
+  /* Symbols that aren't in the dynamic symbol table must live in the
+     local GOT.  This includes symbols that are completely undefined
+     and which therefore don't bind locally.  We'll report undefined
+     symbols later if appropriate.  */
+  if (h->root.dynindx == -1)
+    return TRUE;
+
+  /* Symbols that bind locally can (and in the case of forced-local
+     symbols, must) live in the local GOT.  */
+  if (h->got_only_for_calls
+      ? SYMBOL_CALLS_LOCAL (info, &h->root)
+      : SYMBOL_REFERENCES_LOCAL (info, &h->root))
+    return TRUE;
+
+  /* If this is an executable that must provide a definition of the symbol,
+     either though PLTs or copy relocations, then that address should go in
+     the local rather than global GOT.  */
+  if (info->executable && h->has_static_relocs)
+    return TRUE;
+
+  return FALSE;
+}
+
 /* A mips_elf_link_hash_traverse callback for which DATA points to the
    link_info structure.  Decide whether the hash entry needs an entry in
    the global part of the primary GOT, setting global_got_area accordingly.
@@ -4318,18 +4348,8 @@ mips_elf_count_got_symbols (struct mips_elf_link_hash_entry *h, void *data)
   if (h->global_got_area != GGA_NONE)
     {
       /* Make a final decision about whether the symbol belongs in the
-        local or global GOT.  Symbols that bind locally can (and in the
-        case of forced-local symbols, must) live in the local GOT.
-        Those that are aren't in the dynamic symbol table must also
-        live in the local GOT.
-
-        Note that the former condition does not always imply the
-        latter: symbols do not bind locally if they are completely
-        undefined.  We'll report undefined symbols later if appropriate.  */
-      if (h->root.dynindx == -1
-         || (h->got_only_for_calls
-             ? SYMBOL_CALLS_LOCAL (info, &h->root)
-             : SYMBOL_REFERENCES_LOCAL (info, &h->root)))
+        local or global GOT.  */
+      if (mips_use_local_got_p (info, h))
        /* The symbol belongs in the local GOT.  We no longer need this
           entry if it was only used for relocations; those relocations
           will be against the null or section symbol instead of H.  */
@@ -5468,10 +5488,7 @@ mips_elf_calculate_relocation (bfd *abfd, bfd *input_bfd,
                                && (target_is_16_bit_code_p
                                    || target_is_micromips_code_p))));
 
-  local_p = (h == NULL
-            || (h->got_only_for_calls
-                ? SYMBOL_CALLS_LOCAL (info, &h->root)
-                : SYMBOL_REFERENCES_LOCAL (info, &h->root)));
+  local_p = (h == NULL || mips_use_local_got_p (info, h));
 
   gp0 = _bfd_get_gp_value (input_bfd);
   gp = _bfd_get_gp_value (abfd);
@@ -7955,6 +7972,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
       unsigned int r_type;
       struct elf_link_hash_entry *h;
       bfd_boolean can_make_dynamic_p;
+      bfd_boolean call_reloc_p;
+      bfd_boolean constrain_symbol_p;
 
       r_symndx = ELF_R_SYM (abfd, rel->r_info);
       r_type = ELF_R_TYPE (abfd, rel->r_info);
@@ -7987,12 +8006,30 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
       /* Set CAN_MAKE_DYNAMIC_P to true if we can convert this
         relocation into a dynamic one.  */
       can_make_dynamic_p = FALSE;
+
+      /* Set CALL_RELOC_P to true if the relocation is for a call,
+        and if pointer equality therefore doesn't matter.  */
+      call_reloc_p = FALSE;
+
+      /* Set CONSTRAIN_SYMBOL_P if we need to take the relocation
+        into account when deciding how to define the symbol.
+        Relocations in nonallocatable sections such as .pdr and
+        .debug* should have no effect.  */
+      constrain_symbol_p = ((sec->flags & SEC_ALLOC) != 0);
+
       switch (r_type)
        {
-       case R_MIPS_GOT16:
        case R_MIPS_CALL16:
        case R_MIPS_CALL_HI16:
        case R_MIPS_CALL_LO16:
+       case R_MIPS16_CALL16:
+       case R_MICROMIPS_CALL16:
+       case R_MICROMIPS_CALL_HI16:
+       case R_MICROMIPS_CALL_LO16:
+         call_reloc_p = TRUE;
+         /* Fall through.  */
+
+       case R_MIPS_GOT16:
        case R_MIPS_GOT_HI16:
        case R_MIPS_GOT_LO16:
        case R_MIPS_GOT_PAGE:
@@ -8002,14 +8039,10 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
        case R_MIPS_TLS_GD:
        case R_MIPS_TLS_LDM:
        case R_MIPS16_GOT16:
-       case R_MIPS16_CALL16:
        case R_MIPS16_TLS_GOTTPREL:
        case R_MIPS16_TLS_GD:
        case R_MIPS16_TLS_LDM:
        case R_MICROMIPS_GOT16:
-       case R_MICROMIPS_CALL16:
-       case R_MICROMIPS_CALL_HI16:
-       case R_MICROMIPS_CALL_LO16:
        case R_MICROMIPS_GOT_HI16:
        case R_MICROMIPS_GOT_LO16:
        case R_MICROMIPS_GOT_PAGE:
@@ -8030,12 +8063,27 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
              bfd_set_error (bfd_error_bad_value);
              return FALSE;
            }
+         can_make_dynamic_p = TRUE;
          break;
 
-         /* This is just a hint; it can safely be ignored.  Don't set
-            has_static_relocs for the corresponding symbol.  */
+       case R_MIPS_NONE:
        case R_MIPS_JALR:
        case R_MICROMIPS_JALR:
+         /* These relocations have empty fields and are purely there to
+            provide link information.  The symbol value doesn't matter.  */
+         constrain_symbol_p = FALSE;
+         break;
+
+       case R_MIPS_GPREL16:
+       case R_MIPS_GPREL32:
+       case R_MIPS16_GPREL:
+       case R_MICROMIPS_GPREL16:
+         /* GP-relative relocations always resolve to a definition in a
+            regular input file, ignoring the one-definition rule.  This is
+            important for the GP setup sequence in NewABI code, which
+            always resolves to a local function even if other relocations
+            against the symbol wouldn't.  */
+         constrain_symbol_p = FALSE;
          break;
 
        case R_MIPS_32:
@@ -8062,35 +8110,8 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
              can_make_dynamic_p = TRUE;
              if (dynobj == NULL)
                elf_hash_table (info)->dynobj = dynobj = abfd;
-             break;
            }
-         /* For sections that are not SEC_ALLOC a copy reloc would be
-            output if possible (implying questionable semantics for
-            read-only data objects) or otherwise the final link would
-            fail as ld.so will not process them and could not therefore
-            handle any outstanding dynamic relocations.
-
-            For such sections that are also SEC_DEBUGGING, we can avoid
-            these problems by simply ignoring any relocs as these
-            sections have a predefined use and we know it is safe to do
-            so.
-
-            This is needed in cases such as a global symbol definition
-            in a shared library causing a common symbol from an object
-            file to be converted to an undefined reference.  If that
-            happens, then all the relocations against this symbol from
-            SEC_DEBUGGING sections in the object file will resolve to
-            nil.  */
-         if ((sec->flags & SEC_DEBUGGING) != 0)
-           break;
-         /* Fall through.  */
-
-       default:
-         /* Most static relocations require pointer equality, except
-            for branches.  */
-         if (h)
-           h->pointer_equality_needed = TRUE;
-         /* Fall through.  */
+         break;
 
        case R_MIPS_26:
        case R_MIPS_PC16:
@@ -8100,13 +8121,28 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
        case R_MICROMIPS_PC10_S1:
        case R_MICROMIPS_PC16_S1:
        case R_MICROMIPS_PC23_S2:
-         if (h)
-           ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = TRUE;
+         call_reloc_p = TRUE;
          break;
        }
 
       if (h)
        {
+         if (constrain_symbol_p)
+           {
+             if (!can_make_dynamic_p)
+               ((struct mips_elf_link_hash_entry *) h)->has_static_relocs = 1;
+
+             if (!call_reloc_p)
+               h->pointer_equality_needed = 1;
+
+             /* We must not create a stub for a symbol that has
+                relocations related to taking the function's address.
+                This doesn't apply to VxWorks, where CALL relocs refer
+                to a .got.plt entry instead of a normal .got entry.  */
+             if (!htab->is_vxworks && (!can_make_dynamic_p || !call_reloc_p))
+               ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
+           }
+
          /* Relocations against the special VxWorks __GOTT_BASE__ and
             __GOTT_INDEX__ symbols must be left to the loader.  Allocate
             room for them in .rela.dyn.  */
@@ -8387,28 +8423,6 @@ _bfd_mips_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
            h->plt.plist->need_comp = TRUE;
        }
 
-      /* We must not create a stub for a symbol that has relocations
-        related to taking the function's address.  This doesn't apply to
-        VxWorks, where CALL relocs refer to a .got.plt entry instead of
-        a normal .got entry.  */
-      if (!htab->is_vxworks && h != NULL)
-       switch (r_type)
-         {
-         default:
-           ((struct mips_elf_link_hash_entry *) h)->no_fn_stub = TRUE;
-           break;
-         case R_MIPS16_CALL16:
-         case R_MIPS_CALL16:
-         case R_MIPS_CALL_HI16:
-         case R_MIPS_CALL_LO16:
-         case R_MIPS_JALR:
-         case R_MICROMIPS_CALL16:
-         case R_MICROMIPS_CALL_HI16:
-         case R_MICROMIPS_CALL_LO16:
-         case R_MICROMIPS_JALR:
-           break;
-         }
-
       /* See if this reloc would need to refer to a MIPS16 hard-float stub,
         if there is one.  We only need to handle global symbols here;
         we decide whether to keep or delete stubs for local symbols
index 6beeb25..b04f027 100644 (file)
@@ -1,3 +1,22 @@
+2013-10-13  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       * ld-mips-elf/pic-and-nonpic-6-n32.ad,
+       ld-mips-elf/pic-and-nonpic-6-n32.dd,
+       ld-mips-elf/pic-and-nonpic-6-n32.gd,
+       ld-mips-elf/pic-and-nonpic-6-n32.nd,
+       ld-mips-elf/pic-and-nonpic-6-n32.rd,
+       ld-mips-elf/pic-and-nonpic-6-n64.ad,
+       ld-mips-elf/pic-and-nonpic-6-n64.dd,
+       ld-mips-elf/pic-and-nonpic-6-n64.gd,
+       ld-mips-elf/pic-and-nonpic-6-n64.nd,
+       ld-mips-elf/pic-and-nonpic-6-n64.rd,
+       ld-mips-elf/pic-and-nonpic-6-o32.ad,
+       ld-mips-elf/pic-and-nonpic-6-o32.dd,
+       ld-mips-elf/pic-and-nonpic-6-o32.gd,
+       ld-mips-elf/pic-and-nonpic-6-o32.nd,
+       ld-mips-elf/pic-and-nonpic-6-o32.rd: Fix symbol value of extf4.
+       No longer expect extf3, extf4 and extd2 to be in the global GOT.
+
 2013-10-03  Will Newton  <will.newton@linaro.org>
 
        * ld-ifunc/ifunc.exp: Enable ifunc tests for AArch64.
index fab5581..5df3c6c 100644 (file)
@@ -16,10 +16,10 @@ Dynamic section at offset .* contains .*:
  0x70000001 \(MIPS_RLD_VERSION\) * 1
  0x70000005 \(MIPS_FLAGS\) * NOTPOT
  0x70000006 \(MIPS_BASE_ADDRESS\) * 0x40000
- 0x7000000a \(MIPS_LOCAL_GOTNO\) * 2
+ 0x7000000a \(MIPS_LOCAL_GOTNO\) * 5
  0x70000011 \(MIPS_SYMTABNO\) * 12
  0x70000012 \(MIPS_UNREFEXTNO\) * .*
- 0x70000013 \(MIPS_GOTSYM\) * 0x5
+ 0x70000013 \(MIPS_GOTSYM\) * 0x8
  0x00000014 \(PLTREL\) * REL
  0x00000017 \(JMPREL\) * 0x43028
  0x00000002 \(PLTRELSZ\) * 24 \(bytes\)
index df8d02a..276d874 100644 (file)
@@ -2,13 +2,13 @@
 #
 # -32752: lazy resolution function
 # -32748: reserved for module pointer
-# -32744: extf2's GOT entry (undefined 0)
-# -32740: extf3's GOT entry (PLT entry)
-# -32736: extd2's GOT entry (copy reloc)
-# -32732: extf1's GOT entry (.MIPS.stubs entry)
-# -32728: extd1's GOT entry (undefined 0)
-# -32724: extf4's GOT entry (PLT entry)
-# -32620: extd4's GOT entry (undefined 0, reloc only)
+# -32744: extd2's local GOT entry (copy reloc)
+# -32740: extf3's local GOT entry (PLT entry)
+# -32736: extf4's local GOT entry (PLT entry)
+# -32732: extf2's global GOT entry (undefined 0)
+# -32728: extf1's global GOT entry (.MIPS.stubs entry)
+# -32724: extd1's global GOT entry (undefined 0)
+# -32720: extd4's global GOT entry (undefined 0, reloc only)
 
 .*
 
@@ -61,14 +61,14 @@ Disassembly of section \.text:
    44020:      3c1c0006        lui     gp,0x6
    44024:      0399e021        addu    gp,gp,t9
    44028:      279c3fd0        addiu   gp,gp,16336
-   4402c:      8f998024        lw      t9,-32732\(gp\)
-   44030:      8f848018        lw      a0,-32744\(gp\)
-   44034:      8f858028        lw      a1,-32728\(gp\)
+   4402c:      8f998028        lw      t9,-32728\(gp\)
+   44030:      8f848024        lw      a0,-32732\(gp\)
+   44034:      8f85802c        lw      a1,-32724\(gp\)
    44038:      0320f809        jalr    t9
-   4403c:      8f868020        lw      a2,-32736\(gp\)
+   4403c:      8f868018        lw      a2,-32744\(gp\)
    44040:      8f99801c        lw      t9,-32740\(gp\)
    44044:      03200008        jr      t9
-   44048:      8f84802c        lw      a0,-32724\(gp\)
+   44048:      8f848020        lw      a0,-32736\(gp\)
 
 0004404c <f3>:
    4404c:      03e00008        jr      ra
@@ -98,5 +98,5 @@ Disassembly of section \.MIPS\.stubs:
    440a0:      8f998010        lw      t9,-32752\(gp\)
    440a4:      03e07821        move    t3,ra
    440a8:      0320f809        jalr    t9
-   440ac:      24180008        li      t8,8
+   440ac:      24180009        li      t8,9
        \.\.\.
index 8b6b5a0..d5d1b42 100644 (file)
@@ -7,14 +7,17 @@ Primary GOT:
   000a0000 -32752\(gp\) 00000000 Lazy resolver
   000a0004 -32748\(gp\) 80000000 Module pointer \(GNU extension\)
 
+ Local entries:
+   Address     Access  Initial
+  000a0008 -32744\(gp\) 000a2000
+  000a000c -32740\(gp\) 00043080
+  000a0010 -32736\(gp\) 00043060
+
  Global entries:
    Address     Access  Initial Sym\.Val\. Type    Ndx Name
-  000a0008 -32744\(gp\) 00000000 00000000 FUNC    UND extf2
-  000a000c -32740\(gp\) 00000000 00000000 FUNC    UND extf3
-  000a0010 -32736\(gp\) 000a2000 000a2000 OBJECT   16 extd2
-  000a0014 -32732\(gp\) 000440a0 000440a0 FUNC    UND extf1
-  000a0018 -32728\(gp\) 00000000 00000000 OBJECT  UND extd1
-  000a001c -32724\(gp\) 00000000 00000000 FUNC    UND extf4
+  000a0014 -32732\(gp\) 00000000 00000000 FUNC    UND extf2
+  000a0018 -32728\(gp\) 000440a0 000440a0 FUNC    UND extf1
+  000a001c -32724\(gp\) 00000000 00000000 OBJECT  UND extd1
   000a0020 -32720\(gp\) 00000000 00000000 OBJECT  UND extd4
 
 
@@ -27,6 +30,6 @@ PLT GOT:
 
  Entries:
    Address  Initial Sym.Val. Type    Ndx Name
-  00081008 00043040 00000000 FUNC    UND extf4
+  00081008 00043040 00043060 FUNC    UND extf4
   0008100c 00043040 00000000 FUNC    UND extf5
   00081010 00043040 00000000 FUNC    UND extf3
index 07bfa6b..f93c741 100644 (file)
@@ -1,17 +1,40 @@
 
 Symbol table '\.dynsym' contains .*:
+#
+# extf4 is referenced by a JAL and .word.  The former requires a PLT entry
+# and the latter requires pointer equality, which means a symbol value is
+# needed.
 #...
-.*: 00000000 +0 +FUNC +GLOBAL +DEFAULT +UND +extf5
+.*: 0+43060 +0 +FUNC +GLOBAL +DEFAULT \[MIPS PLT\] +UND +extf4
+#
+# extf5 is called but does not have its address taken.  It needs a PLT
+# but no symbol value should be set.
+#...
+.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf5
+#
+# extd2 is referenced by %got, .word and %hi/%lo.  The last pair forces
+# a copy reloc.
+#
+.*: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2
+#
+# extf3 is referenced by a JAL and a GOT CALL reloc.  The JAL forces a PLT
+# that the GOT CALL reloc will also use, but pointer equality isn't needed
+# and so no symbol value should be set.
+#
+.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3
+#
+# extd3 is referenced by .word and %hi/%lo.  The latter pair forces
+# a copy reloc.
+#...
+.*: 0+a2018 +28 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd3
+#
 # The index on the next line should correspond to MIPS_GOTSYM,
 # and the remaining symbols should have the same order as the
 # GOT layout given in the *.dd dump.
-#...
- *5: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2
- *6: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3
- *7: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2
- *8: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1
- *9: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1
- *10: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf4
+#
+ *8: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2
+ *9: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1
+ *10: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1
  *11: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd4
 
 #pass
index 0fd5b7e..afeae98 100644 (file)
@@ -2,13 +2,13 @@
 Relocation section '\.rel\.dyn' at offset .* contains .*:
  * Offset * Info * Type * Sym\.Value * Sym\. Name
 00000000 * 00000000 * R_MIPS_NONE *
-000a2018 * [^ ]*7e * R_MIPS_COPY * 000a2018 * extd3
 000a2000 * [^ ]*7e * R_MIPS_COPY * 000a2000 * extd2
+000a2018 * [^ ]*7e * R_MIPS_COPY * 000a2018 * extd3
 000a1000 * [^ ]*03 * R_MIPS_REL32 * 00000000 * extd1
 000a1014 * [^ ]*03 * R_MIPS_REL32 * 00000000 * extd4
 
 Relocation section '\.rel\.plt' at offset .* contains .*:
  * Offset * Info * Type * Sym\.Value * Sym\. Name
-00081008 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf4
+00081008 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00043060 * extf4
 0008100c * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf5
 00081010 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf3
index 5550483..d8fc300 100644 (file)
@@ -16,10 +16,10 @@ Dynamic section at offset .* contains .*:
  0x0+70000001 \(MIPS_RLD_VERSION\) * 1
  0x0+70000005 \(MIPS_FLAGS\) * NOTPOT
  0x0+70000006 \(MIPS_BASE_ADDRESS\) * 0x40000
- 0x0+7000000a \(MIPS_LOCAL_GOTNO\) * 2
+ 0x0+7000000a \(MIPS_LOCAL_GOTNO\) * 5
  0x0+70000011 \(MIPS_SYMTABNO\) * 12
  0x0+70000012 \(MIPS_UNREFEXTNO\) * .*
- 0x0+70000013 \(MIPS_GOTSYM\) * 0x5
+ 0x0+70000013 \(MIPS_GOTSYM\) * 0x8
  0x0+00000014 \(PLTREL\) * REL
  0x0+00000017 \(JMPREL\) * 0x43050
  0x0+00000002 \(PLTRELSZ\) * 48 \(bytes\)
index 2480623..fbb3615 100644 (file)
@@ -1,14 +1,14 @@
 # GOT layout:
 #
 # -32752: lazy resolution function
-# -32744: reserved for module pointer
-# -32736: extf2's GOT entry (undefined 0)
-# -32728: extf3's GOT entry (PLT entry)
-# -32720: extd2's GOT entry (copy reloc)
-# -32712: extf1's GOT entry (.MIPS.stubs entry)
-# -32704: extd1's GOT entry (undefined 0)
-# -32696: extf4's GOT entry (PLT entry)
-# -32688: extd4's GOT entry (undefined 0, reloc only)
+# -32748: reserved for module pointer
+# -32744: extd2's local GOT entry (copy reloc)
+# -32740: extf3's local GOT entry (PLT entry)
+# -32736: extf4's local GOT entry (PLT entry)
+# -32732: extf2's global GOT entry (undefined 0)
+# -32728: extf1's global GOT entry (.MIPS.stubs entry)
+# -32724: extd1's global GOT entry (undefined 0)
+# -32720: extd4's global GOT entry (undefined 0, reloc only)
 
 .*
 
@@ -61,14 +61,14 @@ Disassembly of section \.text:
    44020:      3c1c0006        lui     gp,0x6
    44024:      0399e021        addu    gp,gp,t9
    44028:      279c3fd0        addiu   gp,gp,16336
-   4402c:      df998038        ld      t9,-32712\(gp\)
-   44030:      df848020        ld      a0,-32736\(gp\)
-   44034:      df858040        ld      a1,-32704\(gp\)
+   4402c:      df998040        ld      t9,-32704\(gp\)
+   44030:      df848038        ld      a0,-32712\(gp\)
+   44034:      df858048        ld      a1,-32696\(gp\)
    44038:      0320f809        jalr    t9
-   4403c:      df868030        ld      a2,-32720\(gp\)
+   4403c:      df868020        ld      a2,-32736\(gp\)
    44040:      df998028        ld      t9,-32728\(gp\)
    44044:      03200008        jr      t9
-   44048:      df848048        ld      a0,-32696\(gp\)
+   44048:      df848030        ld      a0,-32720\(gp\)
 
 0+4404c <f3>:
    4404c:      03e00008        jr      ra
@@ -98,5 +98,5 @@ Disassembly of section \.MIPS\.stubs:
    440a0:      df998010        ld      t9,-32752\(gp\)
    440a4:      03e0782d        move    t3,ra
    440a8:      0320f809        jalr    t9
-   440ac:      64180008        daddiu  t8,zero,8
+   440ac:      64180009        daddiu  t8,zero,9
        \.\.\.
index 767d150..46cbcdd 100644 (file)
@@ -1,32 +1,35 @@
 
 Primary GOT:
- Canonical gp value: 00000000000a7ff0
+ Canonical gp value: 0+0a7ff0
 
  Reserved entries:
-           Address     Access          Initial Purpose
-  00000000000a0000 -32752\(gp\) 0000000000000000 Lazy resolver
-  00000000000a0008 -32744\(gp\) 8000000000000000 Module pointer \(GNU extension\)
+ * Address * Access * Initial Purpose
+  0+0a0000 -32752\(gp\) 0+ Lazy resolver
+  0+0a0008 -32744\(gp\) 8000000000000000 Module pointer \(GNU extension\)
+
+ Local entries:
+ * Address * Access * Initial
+  0+0a0010 -32736\(gp\) 0+0a2000
+  0+0a0018 -32728\(gp\) 0+0430c0
+  0+0a0020 -32720\(gp\) 0+0430a0
 
  Global entries:
-           Address     Access          Initial         Sym\.Val\. Type    Ndx Name
-  00000000000a0010 -32736\(gp\) 0000000000000000 0000000000000000 FUNC    UND extf2
-  00000000000a0018 -32728\(gp\) 0000000000000000 0000000000000000 FUNC    UND extf3
-  00000000000a0020 -32720\(gp\) 00000000000a2000 00000000000a2000 OBJECT   16 extd2
-  00000000000a0028 -32712\(gp\) 00000000000440a0 00000000000440a0 FUNC    UND extf1
-  00000000000a0030 -32704\(gp\) 0000000000000000 0000000000000000 OBJECT  UND extd1
-  00000000000a0038 -32696\(gp\) 0000000000000000 0000000000000000 FUNC    UND extf4
-  00000000000a0040 -32688\(gp\) 0000000000000000 0000000000000000 OBJECT  UND extd4
+ * Address * Access * Initial * Sym\.Val\. * Type * Ndx Name
+  0+0a0028 -32712\(gp\) 0+000000 0+000000 FUNC    UND extf2
+  0+0a0030 -32704\(gp\) 0+0440a0 0+0440a0 FUNC    UND extf1
+  0+0a0038 -32696\(gp\) 0+000000 0+000000 OBJECT  UND extd1
+  0+0a0040 -32688\(gp\) 0+000000 0+000000 OBJECT  UND extd4
 
 
 PLT GOT:
 
  Reserved entries:
          Address          Initial Purpose
-  0000000000081000 0000000000000000 PLT lazy resolver
-  0000000000081008 0000000000000000 Module pointer
* Address * Initial * Purpose
+  0+081000 0+ PLT lazy resolver
+  0+081008 0+ Module pointer
 
  Entries:
          Address          Initial         Sym.Val. Type    Ndx Name
-  0000000000081010 0000000000043080 0000000000000000 FUNC    UND extf4
-  0000000000081018 0000000000043080 0000000000000000 FUNC    UND extf5
-  0000000000081020 0000000000043080 0000000000000000 FUNC    UND extf3
* Address * Initial * Sym.Val. * Type * Ndx Name
+  0+081010 0+043080 0+0430a0 FUNC    UND extf4
+  0+081018 0+043080 0+000000 FUNC    UND extf5
+  0+081020 0+043080 0+000000 FUNC    UND extf3
index 867389b..63b3fc4 100644 (file)
@@ -1,17 +1,40 @@
 
 Symbol table '\.dynsym' contains .*:
+#
+# extf4 is referenced by a JAL and .word.  The former requires a PLT entry
+# and the latter requires pointer equality, which means a symbol value is
+# needed.
+#...
+.*: 0+430a0 +0 +FUNC +GLOBAL +DEFAULT \[MIPS PLT\] +UND +extf4
+#
+# extf5 is called but does not have its address taken.  It needs a PLT
+# but no symbol value should be set.
 #...
 .*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf5
+#
+# extd2 is referenced by %got, .word and %hi/%lo.  The last pair forces
+# a copy reloc.
+#
+.*: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2
+#
+# extf3 is referenced by a JAL and a GOT CALL reloc.  The JAL forces a PLT
+# that the GOT CALL reloc will also use, but pointer equality isn't needed
+# and so no symbol value should be set.
+#
+.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3
+#
+# extd3 is referenced by .word and %hi/%lo.  The latter pair forces
+# a copy reloc.
+#...
+.*: 0+a2018 +28 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd3
+#
 # The index on the next line should correspond to MIPS_GOTSYM,
 # and the remaining symbols should have the same order as the
 # GOT layout given in the *.dd dump.
-#...
- *5: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2
- *6: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3
- *7: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2
- *8: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1
- *9: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1
- *10: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf4
+#
+ *8: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2
+ *9: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1
+ *10: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1
  *11: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd4
 
 #pass
index 666785e..2b25b0a 100644 (file)
@@ -4,10 +4,10 @@ Relocation section '\.rel\.dyn' at offset .* contains .*:
 0+00000 * 0+ * R_MIPS_NONE *
  *Type2: R_MIPS_NONE *
  *Type3: R_MIPS_NONE *
-0+a2018 * [^ ]*7e * R_MIPS_COPY * 0+a2018 * extd3
+0+a2000 * [^ ]*7e * R_MIPS_COPY * 0+a2000 * extd2
  *Type2: R_MIPS_NONE *
  *Type3: R_MIPS_NONE *
-0+a2000 * [^ ]*7e * R_MIPS_COPY * 0+a2000 * extd2
+0+a2018 * [^ ]*7e * R_MIPS_COPY * 0+a2018 * extd3
  *Type2: R_MIPS_NONE *
  *Type3: R_MIPS_NONE *
 0+a1000 * [^ ]*03 * R_MIPS_REL32 * 0+00000 * extd1
@@ -19,7 +19,7 @@ Relocation section '\.rel\.dyn' at offset .* contains .*:
 
 Relocation section '\.rel\.plt' at offset .* contains .*:
  * Offset * Info * Type * Sym\. Value * Sym\. Name
-0+81010 * [^ ]*7f * R_MIPS_JUMP_SLOT * 0+00000 * extf4
+0+81010 * [^ ]*7f * R_MIPS_JUMP_SLOT * 0+430a0 * extf4
  *Type2: R_MIPS_NONE *
  *Type3: R_MIPS_NONE *
 0+81018 * [^ ]*7f * R_MIPS_JUMP_SLOT * 0+00000 * extf5
index fab5581..5df3c6c 100644 (file)
@@ -16,10 +16,10 @@ Dynamic section at offset .* contains .*:
  0x70000001 \(MIPS_RLD_VERSION\) * 1
  0x70000005 \(MIPS_FLAGS\) * NOTPOT
  0x70000006 \(MIPS_BASE_ADDRESS\) * 0x40000
- 0x7000000a \(MIPS_LOCAL_GOTNO\) * 2
+ 0x7000000a \(MIPS_LOCAL_GOTNO\) * 5
  0x70000011 \(MIPS_SYMTABNO\) * 12
  0x70000012 \(MIPS_UNREFEXTNO\) * .*
- 0x70000013 \(MIPS_GOTSYM\) * 0x5
+ 0x70000013 \(MIPS_GOTSYM\) * 0x8
  0x00000014 \(PLTREL\) * REL
  0x00000017 \(JMPREL\) * 0x43028
  0x00000002 \(PLTRELSZ\) * 24 \(bytes\)
index 7f101ac..e10a0af 100644 (file)
@@ -2,13 +2,13 @@
 #
 # -32752: lazy resolution function
 # -32748: reserved for module pointer
-# -32744: extf2's GOT entry (undefined 0)
-# -32740: extf3's GOT entry (PLT entry)
-# -32736: extd2's GOT entry (copy reloc)
-# -32732: extf1's GOT entry (.MIPS.stubs entry)
-# -32728: extd1's GOT entry (undefined 0)
-# -32724: extf4's GOT entry (PLT entry)
-# -32620: extd4's GOT entry (undefined 0, reloc only)
+# -32744: extd2's local GOT entry (copy reloc)
+# -32740: extf3's local GOT entry (PLT entry)
+# -32736: extf4's local GOT entry (PLT entry)
+# -32732: extf2's global GOT entry (undefined 0)
+# -32728: extf1's global GOT entry (.MIPS.stubs entry)
+# -32724: extd1's global GOT entry (undefined 0)
+# -32720: extd4's global GOT entry (undefined 0, reloc only)
 
 .*
 
@@ -61,14 +61,14 @@ Disassembly of section \.text:
    44020:      3c1c0006        lui     gp,0x6
    44024:      279c3fd0        addiu   gp,gp,16336
    44028:      0399e021        addu    gp,gp,t9
-   4402c:      8f998024        lw      t9,-32732\(gp\)
-   44030:      8f848018        lw      a0,-32744\(gp\)
-   44034:      8f858028        lw      a1,-32728\(gp\)
+   4402c:      8f998028        lw      t9,-32728\(gp\)
+   44030:      8f848024        lw      a0,-32732\(gp\)
+   44034:      8f85802c        lw      a1,-32724\(gp\)
    44038:      0320f809        jalr    t9
-   4403c:      8f868020        lw      a2,-32736\(gp\)
+   4403c:      8f868018        lw      a2,-32744\(gp\)
    44040:      8f99801c        lw      t9,-32740\(gp\)
    44044:      03200008        jr      t9
-   44048:      8f84802c        lw      a0,-32724\(gp\)
+   44048:      8f848020        lw      a0,-32736\(gp\)
 
 0004404c <f3>:
    4404c:      03e00008        jr      ra
@@ -98,5 +98,5 @@ Disassembly of section \.MIPS\.stubs:
    440a0:      8f998010        lw      t9,-32752\(gp\)
    440a4:      03e07821        move    t7,ra
    440a8:      0320f809        jalr    t9
-   440ac:      24180008        li      t8,8
+   440ac:      24180009        li      t8,9
        \.\.\.
index 8b6b5a0..d5d1b42 100644 (file)
@@ -7,14 +7,17 @@ Primary GOT:
   000a0000 -32752\(gp\) 00000000 Lazy resolver
   000a0004 -32748\(gp\) 80000000 Module pointer \(GNU extension\)
 
+ Local entries:
+   Address     Access  Initial
+  000a0008 -32744\(gp\) 000a2000
+  000a000c -32740\(gp\) 00043080
+  000a0010 -32736\(gp\) 00043060
+
  Global entries:
    Address     Access  Initial Sym\.Val\. Type    Ndx Name
-  000a0008 -32744\(gp\) 00000000 00000000 FUNC    UND extf2
-  000a000c -32740\(gp\) 00000000 00000000 FUNC    UND extf3
-  000a0010 -32736\(gp\) 000a2000 000a2000 OBJECT   16 extd2
-  000a0014 -32732\(gp\) 000440a0 000440a0 FUNC    UND extf1
-  000a0018 -32728\(gp\) 00000000 00000000 OBJECT  UND extd1
-  000a001c -32724\(gp\) 00000000 00000000 FUNC    UND extf4
+  000a0014 -32732\(gp\) 00000000 00000000 FUNC    UND extf2
+  000a0018 -32728\(gp\) 000440a0 000440a0 FUNC    UND extf1
+  000a001c -32724\(gp\) 00000000 00000000 OBJECT  UND extd1
   000a0020 -32720\(gp\) 00000000 00000000 OBJECT  UND extd4
 
 
@@ -27,6 +30,6 @@ PLT GOT:
 
  Entries:
    Address  Initial Sym.Val. Type    Ndx Name
-  00081008 00043040 00000000 FUNC    UND extf4
+  00081008 00043040 00043060 FUNC    UND extf4
   0008100c 00043040 00000000 FUNC    UND extf5
   00081010 00043040 00000000 FUNC    UND extf3
index 07bfa6b..f93c741 100644 (file)
@@ -1,17 +1,40 @@
 
 Symbol table '\.dynsym' contains .*:
+#
+# extf4 is referenced by a JAL and .word.  The former requires a PLT entry
+# and the latter requires pointer equality, which means a symbol value is
+# needed.
 #...
-.*: 00000000 +0 +FUNC +GLOBAL +DEFAULT +UND +extf5
+.*: 0+43060 +0 +FUNC +GLOBAL +DEFAULT \[MIPS PLT\] +UND +extf4
+#
+# extf5 is called but does not have its address taken.  It needs a PLT
+# but no symbol value should be set.
+#...
+.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf5
+#
+# extd2 is referenced by %got, .word and %hi/%lo.  The last pair forces
+# a copy reloc.
+#
+.*: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2
+#
+# extf3 is referenced by a JAL and a GOT CALL reloc.  The JAL forces a PLT
+# that the GOT CALL reloc will also use, but pointer equality isn't needed
+# and so no symbol value should be set.
+#
+.*: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3
+#
+# extd3 is referenced by .word and %hi/%lo.  The latter pair forces
+# a copy reloc.
+#...
+.*: 0+a2018 +28 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd3
+#
 # The index on the next line should correspond to MIPS_GOTSYM,
 # and the remaining symbols should have the same order as the
 # GOT layout given in the *.dd dump.
-#...
- *5: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2
- *6: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf3
- *7: 0+a2000 +24 +OBJECT +GLOBAL +DEFAULT +[0-9]+ +extd2
- *8: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1
- *9: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1
- *10: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf4
+#
+ *8: 0+ +0 +FUNC +GLOBAL +DEFAULT +UND +extf2
+ *9: 0+440a0 +0 +FUNC +GLOBAL +DEFAULT +UND +extf1
+ *10: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd1
  *11: 0+ +0 +OBJECT +GLOBAL +DEFAULT +UND +extd4
 
 #pass
index 0fd5b7e..afeae98 100644 (file)
@@ -2,13 +2,13 @@
 Relocation section '\.rel\.dyn' at offset .* contains .*:
  * Offset * Info * Type * Sym\.Value * Sym\. Name
 00000000 * 00000000 * R_MIPS_NONE *
-000a2018 * [^ ]*7e * R_MIPS_COPY * 000a2018 * extd3
 000a2000 * [^ ]*7e * R_MIPS_COPY * 000a2000 * extd2
+000a2018 * [^ ]*7e * R_MIPS_COPY * 000a2018 * extd3
 000a1000 * [^ ]*03 * R_MIPS_REL32 * 00000000 * extd1
 000a1014 * [^ ]*03 * R_MIPS_REL32 * 00000000 * extd4
 
 Relocation section '\.rel\.plt' at offset .* contains .*:
  * Offset * Info * Type * Sym\.Value * Sym\. Name
-00081008 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf4
+00081008 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00043060 * extf4
 0008100c * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf5
 00081010 * [^ ]*7f * R_MIPS_JUMP_SLOT * 00000000 * extf3