diff options
Diffstat (limited to 'lld/ELF')
| -rw-r--r-- | lld/ELF/Writer.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index e86c9a64d21..9902cc4e19d 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -12,6 +12,7 @@ #include "Error.h" #include "SymbolTable.h" #include "Writer.h" +#include "Symbols.h" #include "llvm/ADT/DenseMap.h" #include "llvm/Support/FileOutputBuffer.h" @@ -214,8 +215,24 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) { llvm::StringTableBuilder &Builder = Table.getStringBuilder(); for (auto &P : Table.getSymbols()) { StringRef Name = P.first; - auto *S = reinterpret_cast<Elf_Sym *>(Buf); - S->st_name = Builder.getOffset(Name); + Symbol *Sym = P.second; + + auto *ESym = reinterpret_cast<Elf_Sym *>(Buf); + ESym->st_name = Builder.getOffset(Name); + uint8_t Binding; + switch (Sym->Body->kind()) { + case SymbolBody::UndefinedKind: + llvm_unreachable("Should be defined by now"); + case SymbolBody::DefinedRegularKind: + Binding = STB_GLOBAL; + break; + case SymbolBody::UndefinedWeakKind: + case SymbolBody::DefinedWeakKind: + Binding = STB_WEAK; + break; + } + ESym->setBindingAndType(Binding, 0); + Buf += sizeof(Elf_Sym); } } |

