diff --git a/llvm/test/tools/llvm-objcopy/localize-hidden.test b/llvm/test/tools/llvm-objcopy/localize-hidden.test index 92577075f077..05d747b800bc 100644 --- a/llvm/test/tools/llvm-objcopy/localize-hidden.test +++ b/llvm/test/tools/llvm-objcopy/localize-hidden.test @@ -55,6 +55,12 @@ Symbols: Value: 0x2006 Size: 2 Visibility: STV_HIDDEN + - Name: hiddenGlobalCommon + Type: STT_OBJECT + Index: SHN_COMMON + Value: 0x2006 + Size: 2 + Visibility: STV_HIDDEN - Name: undefGlobal Type: STT_FUNC Size: 8 @@ -142,6 +148,17 @@ Symbols: #CHECK-NEXT: Section: .text #CHECK-NEXT: } #CHECK-NEXT: Symbol { +#CHECK-NEXT: Name: hiddenGlobalCommon +#CHECK-NEXT: Value: 0x2006 +#CHECK-NEXT: Size: 2 +#CHECK-NEXT: Binding: Global +#CHECK-NEXT: Type: Object +#CHECK-NEXT: Other [ +#CHECK-NEXT: STV_HIDDEN +#CHECK-NEXT: ] +#CHECK-NEXT: Section: Common (0xF +#CHECK-NEXT: } +#CHECK-NEXT: Symbol { #CHECK-NEXT: Name: undefGlobal #CHECK-NEXT: Value: 0x0 #CHECK-NEXT: Size: 8 diff --git a/llvm/test/tools/llvm-objcopy/localize.test b/llvm/test/tools/llvm-objcopy/localize.test index d52852ac673b..2e2d6ccd6bf5 100644 --- a/llvm/test/tools/llvm-objcopy/localize.test +++ b/llvm/test/tools/llvm-objcopy/localize.test @@ -1,5 +1,10 @@ # RUN: yaml2obj %s > %t -# RUN: llvm-objcopy --localize-symbol Global -L Local -L Weak %t %t2 +# RUN: llvm-objcopy \ +# RUN: --localize-symbol Global \ +# RUN: -L Local \ +# RUN: -L Weak \ +# RUN: -L GlobalCommon \ +# RUN: %t %t2 # RUN: llvm-readobj -symbols %t2 | FileCheck %s !ELF @@ -40,6 +45,11 @@ Symbols: Size: 8 Section: .text Value: 0x1010 + - Name: GlobalCommon + Type: STT_OBJECT + Index: SHN_COMMON + Value: 0x2006 + Size: 2 #CHECK: Symbols [ #CHECK-NEXT: Symbol { @@ -78,4 +88,13 @@ Symbols: #CHECK-NEXT: Other: 0 #CHECK-NEXT: Section: .text #CHECK-NEXT: } +#CHECK-NEXT: Symbol { +#CHECK-NEXT: Name: GlobalCommon +#CHECK-NEXT: Value: 0x2006 +#CHECK-NEXT: Size: 2 +#CHECK-NEXT: Binding: Global +#CHECK-NEXT: Type: Object +#CHECK-NEXT: Other: 0 +#CHECK-NEXT: Section: Common (0xF +#CHECK-NEXT: } #CHECK-NEXT:] diff --git a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp index 2bad270cda7e..a367a30c467f 100644 --- a/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -213,10 +213,11 @@ static void handleArgs(const CopyConfig &Config, Object &Obj, // them. if (Obj.SymbolTable) { Obj.SymbolTable->updateSymbols([&](Symbol &Sym) { - if ((Config.LocalizeHidden && - (Sym.Visibility == STV_HIDDEN || Sym.Visibility == STV_INTERNAL)) || - (!Config.SymbolsToLocalize.empty() && - is_contained(Config.SymbolsToLocalize, Sym.Name))) + if (!Sym.isCommon() && + ((Config.LocalizeHidden && + (Sym.Visibility == STV_HIDDEN || Sym.Visibility == STV_INTERNAL)) || + (!Config.SymbolsToLocalize.empty() && + is_contained(Config.SymbolsToLocalize, Sym.Name)))) Sym.Binding = STB_LOCAL; // Note: these two globalize flags have very similar names but different diff --git a/llvm/tools/llvm-objcopy/ELF/Object.cpp b/llvm/tools/llvm-objcopy/ELF/Object.cpp index ef3029b477a6..c2af99fc197d 100644 --- a/llvm/tools/llvm-objcopy/ELF/Object.cpp +++ b/llvm/tools/llvm-objcopy/ELF/Object.cpp @@ -332,6 +332,8 @@ uint16_t Symbol::getShndx() const { llvm_unreachable("Symbol with invalid ShndxType encountered"); } +bool Symbol::isCommon() const { return getShndx() == SHN_COMMON; } + void SymbolTableSection::assignIndices() { uint32_t Index = 0; for (auto &Sym : Symbols) diff --git a/llvm/tools/llvm-objcopy/ELF/Object.h b/llvm/tools/llvm-objcopy/ELF/Object.h index 4aa3125f26c4..91ff1cddac17 100644 --- a/llvm/tools/llvm-objcopy/ELF/Object.h +++ b/llvm/tools/llvm-objcopy/ELF/Object.h @@ -415,6 +415,7 @@ struct Symbol { bool Referenced = false; uint16_t getShndx() const; + bool isCommon() const; }; class SectionIndexSection : public SectionBase {