[PATCH] D107535: [ELF] Support copy relocation on non-default version symbols

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 5 10:32:20 PDT 2021


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG72d070b4db2d: [ELF] Support copy relocation on non-default version symbols (authored by MaskRay).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D107535/new/

https://reviews.llvm.org/D107535

Files:
  lld/ELF/Relocations.cpp
  lld/test/ELF/Inputs/copy-rel-version.s
  lld/test/ELF/copy-rel-version.s


Index: lld/test/ELF/copy-rel-version.s
===================================================================
--- lld/test/ELF/copy-rel-version.s
+++ lld/test/ELF/copy-rel-version.s
@@ -1,15 +1,27 @@
-// REQUIRES: x86
-// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
-// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/copy-rel-version.s -o %t1.o
-// RUN: echo "v1 {}; v2 {};" > %t.ver
-// RUN: ld.lld %t1.o -shared -soname t1.so --version-script=%t.ver -o %t1.so
-// RUN: ld.lld %t.o %t1.so -o %t
-// RUN: llvm-readobj --symbols %t | FileCheck %s
+# REQUIRES: x86
+## Copy relocate a versioned symbol which has a versioned alias.
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %p/Inputs/copy-rel-version.s -o %t.o
+# RUN: echo 'v1 {}; v2 {}; v3 {};' > %t.ver
+# RUN: ld.lld %t.o -shared -soname t.so --version-script=%t.ver -o %t.so
+
+## Copy relocate the default version symbol.
+# RUN: ld.lld %t1.o %t.so -o %t1
+# RUN: llvm-readelf --dyn-syms %t1 | FileCheck %s --check-prefix=CHECK1
+
+# CHECK1:       1: {{.+}}            12 OBJECT  GLOBAL DEFAULT [[#]] foo at v3
+# CHECK1-EMPTY:
+
+## Copy relocate the non-default version symbol.
+# RUN: llvm-objcopy --redefine-sym foo=foo at v1 %t1.o %t2.o
+# RUN: ld.lld %t2.o %t.so -o %t2
+# RUN: llvm-readelf --dyn-syms %t2 | FileCheck %s --check-prefix=CHECK2
+
+# CHECK2:       1: [[ADDR:[0-9a-f]+]] 4 OBJECT  GLOBAL DEFAULT [[#]] foo at v1
+# CHECK2-NEXT:  2: [[ADDR]]          12 OBJECT  GLOBAL DEFAULT [[#]] foo at v3
+# CHECK2-EMPTY:
 
 .global _start
 _start:
   leaq foo, %rax
-
-// CHECK:      Name: foo (
-// CHECK-NEXT: Value:
-// CHECK-NEXT: Size: 8
Index: lld/test/ELF/Inputs/copy-rel-version.s
===================================================================
--- lld/test/ELF/Inputs/copy-rel-version.s
+++ lld/test/ELF/Inputs/copy-rel-version.s
@@ -1,11 +1,22 @@
 .data
-.global foo at v1
-.type foo at v1, @object
-.size foo at v1, 4
-.global foo@@v2
-.type foo@@v2, @object
-.size foo@@v2, 8
-foo at v1:
-foo@@v2:
+.global foo_v1
+.symver foo_v1, foo at v1, remove
+.type foo_v1, @object
+.size foo_v1, 4
+
+.global foo_v2
+.symver foo_v2, foo at v2, remove
+.type foo_v2, @object
+.size foo_v2, 8
+
+.global foo
+.symver foo, foo@@@v3
+.type foo, @object
+.size foo, 12
+
+foo_v1:
+foo_v2:
+foo:
+.int 0
 .int 0
 .int 0
Index: lld/ELF/Relocations.cpp
===================================================================
--- lld/ELF/Relocations.cpp
+++ lld/ELF/Relocations.cpp
@@ -527,6 +527,13 @@
     if (auto *alias = dyn_cast_or_null<SharedSymbol>(sym))
       ret.insert(alias);
   }
+
+  // The loop does not check SHT_GNU_verneed, so ret does not contain
+  // non-default version symbols. If ss has a non-default version, ret won't
+  // contain ss. Just add ss unconditionally. If a non-default version alias is
+  // separately copy relocated, it and ss will have different addresses.
+  // Fortunately this case is impractical and fails with GNU ld as well.
+  ret.insert(&ss);
   return ret;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107535.364540.patch
Type: text/x-patch
Size: 3029 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210805/eb448d52/attachment.bin>


More information about the llvm-commits mailing list