From e63ae7fee4c5d792f35f2eaebdc68cdd0af0faac Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Tue, 25 Jun 2019 06:58:07 +0000 Subject: [PATCH] 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 --- lld/ELF/Symbols.cpp | 6 +++--- lld/test/ELF/lto/common4.ll | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 lld/test/ELF/lto/common4.ll diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index a5bc49dee23c..9a4de4faf106 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -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. diff --git a/lld/test/ELF/lto/common4.ll b/lld/test/ELF/lto/common4.ll new file mode 100644 index 000000000000..1d2f2d9e0a43 --- /dev/null +++ b/lld/test/ELF/lto/common4.ll @@ -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