[PATCH] D63132: [ELF][RISCV] Set st_shndx of __global_pointer$ to 1 if .sdata does not exist

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 11 04:41:57 PDT 2019


MaskRay created this revision.
MaskRay added reviewers: PkmX, ruiu.
Herald added subscribers: llvm-commits, Jim, benna, psnobl, jocewei, rkruppe, the_o, brucehoult, MartinMosbeck, rogfer01, edward-jones, zzheng, jrtc27, shiva0217, kito-cheng, niosHD, sabuasal, apazos, simoncook, johnrusso, rbar, asb, arichardson, emaste.
Herald added a reviewer: espindola.
Herald added a project: LLVM.

In -pie/-shared mode, lld complains if a PC relative relocation references an absolute symbol (SHN_ABS) but ld.bfd doesn't:

  ld.lld: error: relocation R_RISCV_PCREL_HI20 cannot refer to absolute symbol: __global_pointer$

To allow lla gp, __global_pointer$ when .sdata is absent, give an
arbitrary st_shndx (1) to __global_pointer$ .


Repository:
  rLLD LLVM Linker

https://reviews.llvm.org/D63132

Files:
  ELF/Writer.cpp
  test/ELF/riscv-gp.s


Index: test/ELF/riscv-gp.s
===================================================================
--- /dev/null
+++ test/ELF/riscv-gp.s
@@ -0,0 +1,38 @@
+# REQUIRES: riscv
+# RUN: llvm-mc -filetype=obj -triple=riscv32 %s -o %t.32.o
+# RUN: ld.lld -pie %t.32.o -o %t.32
+# RUN: llvm-readelf -s %t.32 | FileCheck --check-prefix=SYM0 %s
+
+# RUN: llvm-mc -filetype=obj -triple=riscv64 %s -o %t.64.o
+# RUN: ld.lld -shared %t.64.o -o %t.64
+# RUN: llvm-readelf -s %t.64 | FileCheck --check-prefix=SYM0 %s
+
+## If .sdata doesn't exist, it does not matter what the section index is,
+## as long as it is not SHN_ABS, because a PC relative relocation cannot
+## reference an absolute symbol. We arbitrarily set it to 1.
+
+# SYM0: {{0*}}00000800 0 NOTYPE LOCAL HIDDEN 1 __global_pointer$
+
+# RUN: echo '.section .sdata,"aw"' > %t.s
+# RUN: llvm-mc -filetype=obj -triple=riscv32 %t.s -o %t1.32.o
+# RUN: ld.lld -shared %t.32.o %t1.32.o -o %t.32
+# RUN: llvm-readelf -s %t.32 | FileCheck --check-prefix=SYM %s
+# RUN: llvm-readelf -S %t.32 | FileCheck --check-prefix=SEC %s
+# RUN: llvm-objdump -d --no-show-raw-insn %t.32 | FileCheck --check-prefix=DIS %s
+
+# RUN: echo '.section .sdata,"aw"' > %t.s
+# RUN: llvm-mc -filetype=obj -triple=riscv64 %t.s -o %t1.64.o
+# RUN: ld.lld -pie %t.64.o %t1.64.o -o %t.64
+# RUN: llvm-readelf -s %t.64 | FileCheck --check-prefix=SYM %s
+# RUN: llvm-readelf -S %t.64 | FileCheck --check-prefix=SEC %s
+# RUN: llvm-objdump -d --no-show-raw-insn %t.64 | FileCheck --check-prefix=DIS %s
+
+## __global_pointer$ = .sdata+0x800 = 0x3800
+# SEC: [ 7] .sdata PROGBITS {{0*}}00003000
+# SYM: {{0*}}00003800 0 NOTYPE LOCAL HIDDEN 7 __global_pointer$
+
+## __global_pointer$ - 0x1000 = 4096*3-2048
+# DIS:      1000: auipc gp, 3
+# DIS-NEXT:       addi gp, gp, -2048
+
+lla gp, __global_pointer$
Index: ELF/Writer.cpp
===================================================================
--- ELF/Writer.cpp
+++ ELF/Writer.cpp
@@ -1692,9 +1692,17 @@
   addRelIpltSymbols();
 
   // RISC-V's gp can address +/- 2 KiB, set it to .sdata + 0x800 if not defined.
-  if (Config->EMachine == EM_RISCV)
-    if (!dyn_cast_or_null<Defined>(Symtab->find("__global_pointer$")))
-      addOptionalRegular("__global_pointer$", findSection(".sdata"), 0x800);
+  // If .sdata does not exist, give it an arbitrary section number, because the
+  // PC relative relocation in lla gp, __global_pointer$ cannot reference an
+  // absolute symbol.
+  if (Config->EMachine == EM_RISCV) {
+    Symbol *S = Symtab->find("__global_pointer$");
+    OutputSection *Sec = findSection(".sdata");
+    if (S && S->isUndefined())
+      S->resolve(Defined{/*File=*/nullptr, S->getName(), STB_GLOBAL, STV_HIDDEN,
+                         STT_NOTYPE, /*Value=*/0x800, 0,
+                         Sec ? Sec : Out::ElfHeader});
+  }
 
   if (Config->EMachine == EM_X86_64) {
     // On targets that support TLSDESC, _TLS_MODULE_BASE_ is defined in such a


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D63132.204016.patch
Type: text/x-patch
Size: 2937 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190611/b973aacd/attachment.bin>


More information about the llvm-commits mailing list