[lld] r318828 - [ELF] Fix DT_MIPS_LOCAL_GOTNO value for thunks and linker scripts

James Henderson via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 22 04:04:22 PST 2017


Author: jhenderson
Date: Wed Nov 22 04:04:21 2017
New Revision: 318828

URL: http://llvm.org/viewvc/llvm-project?rev=318828&view=rev
Log:
[ELF] Fix DT_MIPS_LOCAL_GOTNO value for thunks and linker scripts

The MIPS GOT section has a number of local entries based on the number of pages
needed for output sections referenced by GOT page relocations. The number is
recorded in the DT_MIPS_LOCAL_GOTNO dynamic section tag. However, the dynamic tag
is added before assignAddresses has been called, meaning that any section size used
to calculate the value will not include size modifications caused by, for example,
linker scripts and thunks.

This change moves the calculation of DT_MIPS_LOCAL_GOTNO until writeTo, by which
time the output section sizes have been finalized.

Reviewers: ruiu, rafael

Differential Revision: https://reviews.llvm.org/D39493

Added:
    lld/trunk/test/ELF/mips-got-script.s
Modified:
    lld/trunk/ELF/SyntheticSections.cpp

Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=318828&r1=318827&r2=318828&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Wed Nov 22 04:04:21 2017
@@ -1127,7 +1127,11 @@ template <class ELFT> void DynamicSectio
     add({DT_MIPS_FLAGS, RHF_NOTPOT});
     add({DT_MIPS_BASE_ADDRESS, Target->getImageBase()});
     add({DT_MIPS_SYMTABNO, InX::DynSymTab->getNumSymbols()});
-    add({DT_MIPS_LOCAL_GOTNO, InX::MipsGot->getLocalEntriesNum()});
+
+    // The number of local GOT entries has not yet been finalized. This value
+    // will be set in writeTo().
+    add({DT_MIPS_LOCAL_GOTNO, uint64_t(0)});
+
     if (const Symbol *B = InX::MipsGot->getFirstGlobalEntry())
       add({DT_MIPS_GOTSYM, B->DynsymIndex});
     else
@@ -1162,7 +1166,10 @@ template <class ELFT> void DynamicSectio
       P->d_un.d_ptr = E.Sym->getVA();
       break;
     case Entry::PlainInt:
-      P->d_un.d_val = E.Val;
+      if (Config->EMachine == EM_MIPS && E.Tag == DT_MIPS_LOCAL_GOTNO)
+        P->d_un.d_val = InX::MipsGot->getLocalEntriesNum();
+      else
+        P->d_un.d_val = E.Val;
       break;
     }
     ++P;

Added: lld/trunk/test/ELF/mips-got-script.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/mips-got-script.s?rev=318828&view=auto
==============================================================================
--- lld/trunk/test/ELF/mips-got-script.s (added)
+++ lld/trunk/test/ELF/mips-got-script.s Wed Nov 22 04:04:21 2017
@@ -0,0 +1,47 @@
+# Check number of got entries is adjusted for linker script-added space.
+
+# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o
+# RUN: echo "SECTIONS { .data : { *(.data.1); . += 0x10000; *(.data.2) } }" > %t.script
+# RUN: ld.lld %t.o -shared -o %t.so -T %t.script
+# RUN: llvm-readobj -mips-plt-got -dynamic-table %t.so | FileCheck %s
+
+# REQUIRES: mips
+
+# CHECK: 0x7000000A MIPS_LOCAL_GOTNO 5
+#                                    ^-- 2 * header + 3 local entries
+# CHECK:      Local entries [
+# CHECK-NEXT:   Entry {
+# CHECK-NEXT:     Address:
+# CHECK-NEXT:     Access: -32744
+# CHECK-NEXT:     Initial: 0x0
+#                          ^-- loc1
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Entry {
+# CHECK-NEXT:     Address:
+# CHECK-NEXT:     Access: -32740
+# CHECK-NEXT:     Initial: 0x10000
+#                          ^-- loc2
+# CHECK-NEXT:   }
+# CHECK-NEXT:   Entry {
+# CHECK-NEXT:     Address:
+# CHECK-NEXT:     Access: -32736
+# CHECK-NEXT:     Initial: 0x20000
+#                          ^-- redundant
+# CHECK-NEXT:   }
+# CHECK-NEXT: ]
+
+  .text
+  .globl  foo
+foo:
+  lw      $t0, %got(loc1)($gp)
+  addi    $t0, $t0, %lo(loc1)
+  lw      $t0, %got(loc2)($gp)
+  addi    $t0, $t0, %lo(loc2)
+
+  .section .data.1,"aw",%progbits
+loc1:
+  .word 0
+
+  .section .data.2,"aw",%progbits
+loc2:
+  .word 0




More information about the llvm-commits mailing list