[PATCH] D35724: [ELF] - Fix missing relocation when linking executable with --unresolved-symbols=ignore-all

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 2 00:51:52 PDT 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL309796: [ELF] - Recommit r309252 "[ELF] - Fix missing relocation when linking… (authored by grimar).

Changed prior to commit:
  https://reviews.llvm.org/D35724?vs=109075&id=109288#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D35724

Files:
  lld/trunk/ELF/Symbols.cpp
  lld/trunk/test/ELF/executable-undefined-ignoreall.s
  lld/trunk/test/ELF/executable-undefined-protected-ignoreall.s
  lld/trunk/test/ELF/no-inhibit-exec.s


Index: lld/trunk/test/ELF/no-inhibit-exec.s
===================================================================
--- lld/trunk/test/ELF/no-inhibit-exec.s
+++ lld/trunk/test/ELF/no-inhibit-exec.s
@@ -2,11 +2,15 @@
 # RUN: not ld.lld %t -o %t2
 # RUN: ld.lld %t --noinhibit-exec -o %t2
 # RUN: llvm-objdump -d %t2 | FileCheck %s
+# RUN: llvm-readobj -r %t2 | FileCheck %s --check-prefix=RELOC
 # REQUIRES: x86
 
 # CHECK: Disassembly of section .text:
 # CHECK-NEXT: _start
-# CHECK-NEXT: 201000: {{.*}} callq -2101253
+# CHECK-NEXT: 201000: {{.*}} callq 0
+
+# RELOC:      Relocations [
+# RELOC-NEXT: ]
 
 # next code will not link without noinhibit-exec flag
 # because of undefined symbol _bar
Index: lld/trunk/test/ELF/executable-undefined-protected-ignoreall.s
===================================================================
--- lld/trunk/test/ELF/executable-undefined-protected-ignoreall.s
+++ lld/trunk/test/ELF/executable-undefined-protected-ignoreall.s
@@ -0,0 +1,8 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: not ld.lld %t -o %tout --unresolved-symbols=ignore-all -pie 2>&1 | FileCheck %s
+# CHECK: error: undefined symbol: foo
+
+.protected foo
+_start:
+callq foo at PLT
Index: lld/trunk/test/ELF/executable-undefined-ignoreall.s
===================================================================
--- lld/trunk/test/ELF/executable-undefined-ignoreall.s
+++ lld/trunk/test/ELF/executable-undefined-ignoreall.s
@@ -0,0 +1,13 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
+# RUN: ld.lld %t -o %tout --unresolved-symbols=ignore-all -pie
+# RUN: llvm-readobj -r %tout | FileCheck %s
+
+# CHECK:      Relocations [
+# CHECK-NEXT:   Section ({{.*}}) .rela.plt {
+# CHECK-NEXT:     0x2018 R_X86_64_JUMP_SLOT foo 0x0
+# CHECK-NEXT:   }
+# CHECK-NEXT: ]
+
+_start:
+callq foo at PLT
Index: lld/trunk/ELF/Symbols.cpp
===================================================================
--- lld/trunk/ELF/Symbols.cpp
+++ lld/trunk/ELF/Symbols.cpp
@@ -141,18 +141,23 @@
   if (isShared())
     return !NeedsCopy && !NeedsPltAddr;
 
-  // That's all that can be preempted in a non-DSO.
-  if (!Config->Shared)
-    return false;
-
   // Only symbols that appear in dynsym can be preempted.
   if (!symbol()->includeInDynsym())
     return false;
 
   // Only default visibility symbols can be preempted.
   if (symbol()->Visibility != STV_DEFAULT)
     return false;
 
+  // Undefined symbols in non-DSOs are usually just an error, so it
+  // doesn't matter whether we return true or false here. However, if
+  // -unresolved-symbols=ignore-all is specified, undefined symbols in
+  // executables are automatically exported so that the runtime linker
+  // can try to resolve them. In that case, they is preemptible. So, we
+  // return true for an undefined symbol in case the option is specified.
+  if (!Config->Shared)
+    return isUndefined();
+
   // -Bsymbolic means that definitions are not preempted.
   if (Config->Bsymbolic || (Config->BsymbolicFunctions && isFunc()))
     return !isDefined();
@@ -358,7 +363,7 @@
   if (computeBinding() == STB_LOCAL)
     return false;
   if (body()->isUndefined())
-    return Config->Shared;
+    return Config->Shared || !body()->symbol()->isWeak();
   return ExportDynamic || body()->isShared();
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D35724.109288.patch
Type: text/x-patch
Size: 3343 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170802/0eeaedfb/attachment.bin>


More information about the llvm-commits mailing list