[lld] r309258 - Revert r309252 "[ELF] - Fix missing relocation when linking executable with --unresolved-symbols=ignore-all"

George Rimar via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 27 02:25:16 PDT 2017


Author: grimar
Date: Thu Jul 27 02:25:16 2017
New Revision: 309258

URL: http://llvm.org/viewvc/llvm-project?rev=309258&view=rev
Log:
Revert r309252 "[ELF] - Fix missing relocation when linking executable with --unresolved-symbols=ignore-all"

It broke bot:
http://lab.llvm.org:8011/builders/clang-with-thin-lto-ubuntu/builds/4231

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

Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=309258&r1=309257&r2=309258&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Thu Jul 27 02:25:16 2017
@@ -141,6 +141,10 @@ bool SymbolBody::isPreemptible() const {
   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;
@@ -149,15 +153,6 @@ bool SymbolBody::isPreemptible() const {
   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();
@@ -362,11 +357,8 @@ uint8_t Symbol::computeBinding() const {
 bool Symbol::includeInDynsym() const {
   if (computeBinding() == STB_LOCAL)
     return false;
-  if (ExportDynamic || body()->isShared())
-    return true;
-  if (!body()->isUndefined())
-    return false;
-  return Config->Shared || !body()->symbol()->isWeak();
+  return ExportDynamic || body()->isShared() ||
+         (body()->isUndefined() && Config->Shared);
 }
 
 // Print out a log message for --trace-symbol.

Removed: lld/trunk/test/ELF/executable-undefined-ignoreall.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/executable-undefined-ignoreall.s?rev=309257&view=auto
==============================================================================
--- lld/trunk/test/ELF/executable-undefined-ignoreall.s (original)
+++ lld/trunk/test/ELF/executable-undefined-ignoreall.s (removed)
@@ -1,13 +0,0 @@
-# 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

Removed: lld/trunk/test/ELF/executable-undefined-protected-ignoreall.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/executable-undefined-protected-ignoreall.s?rev=309257&view=auto
==============================================================================
--- lld/trunk/test/ELF/executable-undefined-protected-ignoreall.s (original)
+++ lld/trunk/test/ELF/executable-undefined-protected-ignoreall.s (removed)
@@ -1,8 +0,0 @@
-# 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

Modified: lld/trunk/test/ELF/no-inhibit-exec.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/no-inhibit-exec.s?rev=309258&r1=309257&r2=309258&view=diff
==============================================================================
--- lld/trunk/test/ELF/no-inhibit-exec.s (original)
+++ lld/trunk/test/ELF/no-inhibit-exec.s Thu Jul 27 02:25:16 2017
@@ -2,15 +2,11 @@
 # 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 0
-
-# RELOC: Relocations [
-# RELOC: ]
+# CHECK-NEXT: 201000: {{.*}} callq -2101253
 
 # next code will not link without noinhibit-exec flag
 # because of undefined symbol _bar




More information about the llvm-commits mailing list