diff options
Diffstat (limited to 'lld')
| -rw-r--r-- | lld/ELF/Writer.cpp | 21 | ||||
| -rw-r--r-- | lld/test/elf2/symbols.s | 4 |
2 files changed, 21 insertions, 4 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); } } diff --git a/lld/test/elf2/symbols.s b/lld/test/elf2/symbols.s index e701f6fbae3..148a1b9d527 100644 --- a/lld/test/elf2/symbols.s +++ b/lld/test/elf2/symbols.s @@ -23,7 +23,7 @@ foo: // CHECK-NEXT: Name: _start // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local (0x0) +// CHECK-NEXT: Binding: Global (0x1) // CHECK-NEXT: Type: None (0x0) // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined (0x0) @@ -32,7 +32,7 @@ foo: // CHECK-NEXT: Name: foo // CHECK-NEXT: Value: 0x0 // CHECK-NEXT: Size: 0 -// CHECK-NEXT: Binding: Local (0x0) +// CHECK-NEXT: Binding: Weak (0x2) // CHECK-NEXT: Type: None (0x0) // CHECK-NEXT: Other: 0 // CHECK-NEXT: Section: Undefined (0x0) |

