Fix an issue that common symbols are not internalized under some condition.

r360841 introduced CommonSymbol class. An unintended behavioral change
introduced by that change was that common symbols are not internalized
by LTO under some condition. This patch fixes that issue.

The issue occurred under the following condition:

  1. There exists a common symbol
  2. At least one DSO is given to lld or -pie is used

If the above conditions are met, Symbol::includeInDynsym() returned a
wrong value for a common symbol.

Fixes https://bugs.llvm.org/show_bug.cgi?id=41978

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

llvm-svn: 364273
This commit is contained in:
Rui Ueyama 2019-06-25 06:58:07 +00:00
parent 33e547bdde
commit e63ae7fee4
2 changed files with 24 additions and 3 deletions

View File

@ -275,13 +275,13 @@ bool Symbol::includeInDynsym() const {
return false;
if (computeBinding() == STB_LOCAL)
return false;
// If a PIE binary was not linked against any shared libraries, then we can
// safely drop weak undef symbols from .dynsym.
if (isUndefWeak() && Config->Pie && SharedFiles.empty())
return false;
if (!isDefined())
return true;
return ExportDynamic;
return isUndefined() || isShared() || ExportDynamic;
}
// Print out a log message for --trace-symbol.

View File

@ -0,0 +1,21 @@
; REQUIRES: x86
;; Make sure that common symbols are properly internalized.
;; In this file, @a does not interpose any symbol in a DSO,
;; so LTO should be able to internelize it.
; RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux /dev/null -o %t.so.o
; RUN: ld.lld -shared -o %t.so %t.so.o
; RUN: llvm-as %s -o %t.o
; RUN: ld.lld -o %t.exe -save-temps %t.o %t.so
; RUN: llvm-dis < %t.exe.0.2.internalize.bc | FileCheck %s
; RUN: ld.lld -pie -o %t.exe -save-temps %t.o
; RUN: llvm-dis < %t.exe.0.2.internalize.bc | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@a = common dso_local local_unnamed_addr global i32 0, align 4
; CHECK-DAG: @a = internal global i32 0, align 4