summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/test/tools/llvm-objcopy/localize-hidden.test17
-rw-r--r--llvm/test/tools/llvm-objcopy/localize.test21
-rw-r--r--llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp9
-rw-r--r--llvm/tools/llvm-objcopy/ELF/Object.cpp2
-rw-r--r--llvm/tools/llvm-objcopy/ELF/Object.h1
5 files changed, 45 insertions, 5 deletions
diff --git a/llvm/test/tools/llvm-objcopy/localize-hidden.test b/llvm/test/tools/llvm-objcopy/localize-hidden.test
index 92577075f07..05d747b800b 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 d52852ac673..2e2d6ccd6bf 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 2bad270cda7..a367a30c467 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 ef3029b477a..c2af99fc197 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 4aa3125f26c..91ff1cddac1 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 {
OpenPOWER on IntegriCloud