From 634820d414acd9708b65b72af48e90355c631737 Mon Sep 17 00:00:00 2001 From: Jordan Rupprecht Date: Tue, 30 Oct 2018 16:23:38 +0000 Subject: [PATCH] [llvm-objcopy] Fix --keep-global-symbol/--globalize-symbol for undefined symbols. Summary: --keep-global-symbol and --globalize-symbol don't make sense for undefined symbols, so it should be ignored for those symbols. This matches GNU objcopy behavior. Reviewers: jhenderson, alexshap, jakehehrlich, espindola Reviewed By: jhenderson, jakehehrlich Subscribers: emaste, arichardson, llvm-commits Differential Revision: https://reviews.llvm.org/D53733 llvm-svn: 345614 --- llvm/test/tools/llvm-objcopy/globalize.test | 15 ++++++++++++++- llvm/test/tools/llvm-objcopy/keep-global-symbols.test | 10 +++++++--- llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp | 6 ++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/llvm/test/tools/llvm-objcopy/globalize.test b/llvm/test/tools/llvm-objcopy/globalize.test index 5c9d62e..4941cf1 100644 --- a/llvm/test/tools/llvm-objcopy/globalize.test +++ b/llvm/test/tools/llvm-objcopy/globalize.test @@ -1,5 +1,8 @@ # RUN: yaml2obj %s > %t -# RUN: llvm-objcopy --globalize-symbol Global --globalize-symbol Local --globalize-symbol Weak %t %t2 +# RUN: llvm-objcopy --globalize-symbol Global \ +# RUN: --globalize-symbol Local \ +# RUN: --globalize-symbol Weak \ +# RUN: --globalize-symbol WeakUndef %t %t2 # RUN: llvm-readobj -symbols %t2 | FileCheck %s !ELF @@ -28,6 +31,7 @@ Symbols: Size: 8 Section: .text Value: 0x1008 + - Name: WeakUndef Global: - Name: Global Type: STT_FUNC @@ -72,4 +76,13 @@ Symbols: #CHECK-NEXT: Other: 0 #CHECK-NEXT: Section: .text #CHECK-NEXT: } +#CHECK-NEXT: Symbol { +#CHECK-NEXT: Name: WeakUndef +#CHECK-NEXT: Value: 0x0 +#CHECK-NEXT: Size: 0 +#CHECK-NEXT: Binding: Weak +#CHECK-NEXT: Type: None +#CHECK-NEXT: Other: 0 +#CHECK-NEXT: Section: Undefined +#CHECK-NEXT: } #CHECK-NEXT:] diff --git a/llvm/test/tools/llvm-objcopy/keep-global-symbols.test b/llvm/test/tools/llvm-objcopy/keep-global-symbols.test index 4f580b4..8ce1d7f 100644 --- a/llvm/test/tools/llvm-objcopy/keep-global-symbols.test +++ b/llvm/test/tools/llvm-objcopy/keep-global-symbols.test @@ -18,6 +18,8 @@ # "Global5 Global6": Global, because it appears in %t-globals2.txt, but we only # trim leading and trailing whitespace. We don't just take the first chunk # that looks like a symbol. +# Global7: Global, because even though it doesn't appear as any -G flags, does +# not get demoted since it's undefined. # RUN: echo Global2 > %t-globals1.txt # RUN: echo " Global3 " > %t-globals2.txt @@ -77,8 +79,9 @@ Symbols: Section: .text - Name: "Global5 Global6" Section: .text + - Name: Global7 -# CHECK: Symbol table '.symtab' contains 13 entries: +# CHECK: Symbol table '.symtab' contains 14 entries: # CHECK-NEXT: Num: Value Size Type Bind Vis Ndx Name # CHECK-NEXT: 0: {{.*}} LOCAL {{.*}} # CHECK-NEXT: 1: {{.*}} LOCAL {{.*}} Local1 @@ -91,5 +94,6 @@ Symbols: # CHECK-NEXT: 8: {{.*}} GLOBAL {{.*}} Global3 # CHECK-NEXT: 9: {{.*}} GLOBAL {{.*}} Global4 # CHECK-NEXT: 10: {{.*}} GLOBAL {{.*}} Global5 Global6 -# CHECK-NEXT: 11: {{.*}} WEAK {{.*}} Weak1 -# CHECK-NEXT: 12: {{.*}} GLOBAL {{.*}} Weak2 +# CHECK-NEXT: 11: {{.*}} GLOBAL {{.*}} UND Global7 +# CHECK-NEXT: 12: {{.*}} WEAK {{.*}} Weak1 +# CHECK-NEXT: 13: {{.*}} GLOBAL {{.*}} Weak2 diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index 7637978..2bad270 100644 --- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -230,11 +230,13 @@ static void handleArgs(const CopyConfig &Config, Object &Obj, // --keep-global-symbol. Because of that, make sure to check // --globalize-symbol second. if (!Config.SymbolsToKeepGlobal.empty() && - !is_contained(Config.SymbolsToKeepGlobal, Sym.Name)) + !is_contained(Config.SymbolsToKeepGlobal, Sym.Name) && + Sym.getShndx() != SHN_UNDEF) Sym.Binding = STB_LOCAL; if (!Config.SymbolsToGlobalize.empty() && - is_contained(Config.SymbolsToGlobalize, Sym.Name)) + is_contained(Config.SymbolsToGlobalize, Sym.Name) && + Sym.getShndx() != SHN_UNDEF) Sym.Binding = STB_GLOBAL; if (!Config.SymbolsToWeaken.empty() && -- 2.7.4