Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -1507,6 +1507,8 @@ } else if (auto *C = dyn_cast(Body)) { Type = STT_OBJECT; Size = C->Size; + } else if (isa>(Body)) { + Type = Body->getType(); } ESym->setBindingAndType(getSymbolBinding(Body), Type); Index: ELF/SymbolTable.h =================================================================== --- ELF/SymbolTable.h +++ ELF/SymbolTable.h @@ -58,7 +58,7 @@ SymbolBody *addUndefinedOpt(StringRef Name); SymbolBody *addAbsolute(StringRef Name, Elf_Sym &ESym); SymbolBody *addSynthetic(StringRef Name, OutputSectionBase &Section, - uintX_t Value, uint8_t Visibility); + uintX_t Value, uint8_t Visibility, uint8_t Type); SymbolBody *addIgnored(StringRef Name); void scanShlibUndefined(); Index: ELF/SymbolTable.cpp =================================================================== --- ELF/SymbolTable.cpp +++ ELF/SymbolTable.cpp @@ -188,8 +188,10 @@ template SymbolBody *SymbolTable::addSynthetic(StringRef Name, OutputSectionBase &Sec, - uintX_t Val, uint8_t Visibility) { - auto *Sym = new (Alloc) DefinedSynthetic(Name, Val, Sec, Visibility); + uintX_t Val, uint8_t Visibility, + uint8_t Type) { + auto *Sym = new (Alloc) DefinedSynthetic(Name, Val, Sec, Visibility, + Type); resolve(Sym); return Sym; } Index: ELF/Symbols.h =================================================================== --- ELF/Symbols.h +++ ELF/Symbols.h @@ -91,6 +91,7 @@ StringRef getName() const { return Name; } uint8_t getVisibility() const { return Visibility; } + uint8_t getType() const { return Type; } unsigned DynsymIndex = 0; uint32_t GlobalDynIndex = -1; @@ -249,7 +250,7 @@ typedef typename llvm::object::ELFFile::Elf_Sym Elf_Sym; typedef typename llvm::object::ELFFile::uintX_t uintX_t; DefinedSynthetic(StringRef N, uintX_t Value, OutputSectionBase &Section, - uint8_t Visibility); + uint8_t Visibility, uint8_t Type); static bool classof(const SymbolBody *S) { return S->kind() == SymbolBody::DefinedSyntheticKind; Index: ELF/Symbols.cpp =================================================================== --- ELF/Symbols.cpp +++ ELF/Symbols.cpp @@ -192,9 +192,8 @@ template DefinedSynthetic::DefinedSynthetic(StringRef N, uintX_t Value, OutputSectionBase &Section, - uint8_t Visibility) - : Defined(SymbolBody::DefinedSyntheticKind, N, false, Visibility, - 0 /* Type */), + uint8_t Visibility, uint8_t Type) + : Defined(SymbolBody::DefinedSyntheticKind, N, false, Visibility, Type), Value(Value), Section(Section) {} DefinedCommon::DefinedCommon(StringRef N, uint64_t Size, uint64_t Alignment, Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -1014,7 +1014,8 @@ addStartStopSymbols(Sec); } if (isOutputDynamic()) - Symtab.addSynthetic("_DYNAMIC", *Out::Dynamic, 0, STV_HIDDEN); + Symtab.addSynthetic("_DYNAMIC", *Out::Dynamic, 0, STV_HIDDEN, + STT_OBJECT); // Define __rel[a]_iplt_{start,end} symbols if needed. addRelIpltSymbols(); @@ -1157,8 +1158,9 @@ auto Define = [&](StringRef Start, StringRef End, OutputSectionBase *OS) { if (OS) { - Symtab.addSynthetic(Start, *OS, 0, STV_DEFAULT); - Symtab.addSynthetic(End, *OS, OS->getSize(), STV_DEFAULT); + Symtab.addSynthetic(Start, *OS, 0, STV_DEFAULT, 0 /* Type */); + Symtab.addSynthetic(End, *OS, OS->getSize(), STV_DEFAULT, + 0 /* Type */); } else { Symtab.addIgnored(Start); Symtab.addIgnored(End); @@ -1188,10 +1190,11 @@ StringRef Stop = Saver.save("__stop_" + S); if (SymbolBody *B = Symtab.find(Start)) if (B->isUndefined()) - Symtab.addSynthetic(Start, *Sec, 0, STV_DEFAULT); + Symtab.addSynthetic(Start, *Sec, 0, STV_DEFAULT, 0 /* Type */); if (SymbolBody *B = Symtab.find(Stop)) if (B->isUndefined()) - Symtab.addSynthetic(Stop, *Sec, Sec->getSize(), STV_DEFAULT); + Symtab.addSynthetic(Stop, *Sec, Sec->getSize(), STV_DEFAULT, + 0 /* Type */); } template static bool needsPtLoad(OutputSectionBase *Sec) { Index: test/ELF/shared.s =================================================================== --- test/ELF/shared.s +++ test/ELF/shared.s @@ -148,7 +148,7 @@ // CHECK-NEXT: Value: 0x12000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None +// CHECK-NEXT: Type: Object // CHECK-NEXT: Other: 2 // CHECK-NEXT: Section: .dynamic // CHECK-NEXT: } Index: test/ELF/visibility.s =================================================================== --- test/ELF/visibility.s +++ test/ELF/visibility.s @@ -46,7 +46,7 @@ // CHECK-NEXT: Value: 0x2000 // CHECK-NEXT: Size: 0 // CHECK-NEXT: Binding: Local -// CHECK-NEXT: Type: None +// CHECK-NEXT: Type: Object // CHECK-NEXT: Other: 2 // CHECK-NEXT: Section: .dynamic // CHECK-NEXT: }