forked from OSchip/llvm-project
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:
parent
33e547bdde
commit
e63ae7fee4
|
@ -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.
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue