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
#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
# 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
Size: 8
Section: .text
Value: 0x1010
+ - Name: GlobalCommon
+ Type: STT_OBJECT
+ Index: SHN_COMMON
+ Value: 0x2006
+ Size: 2
#CHECK: Symbols [
#CHECK-NEXT: Symbol {
#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:]
// 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
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)
bool Referenced = false;
uint16_t getShndx() const;
+ bool isCommon() const;
};
class SectionIndexSection : public SectionBase {