diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -266,6 +266,8 @@ bool seenGnuAbi() const { return SeenGnuAbi; } void emitAddrsigSection() override { EmitAddrsigSection = true; } void addAddrsigSymbol(const MCSymbol *Sym) override { + const MCSymbolELF *S = cast(Sym); + S->setBinding(ELF::STB_WEAK); AddrsigSyms.push_back(Sym); } diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -218,7 +218,9 @@ void emitAddrsigSection() override { EmitAddrsigSection = true; } void addAddrsigSymbol(const MCSymbol *Sym) override { - AddrsigSyms.push_back(Sym); + const MCSymbolCOFF *S = cast(Sym); + S->setIsWeakExternal(); + AddrsigSyms.push_back(S); } uint64_t writeObject(MCAssembler &Asm, const MCAsmLayout &Layout) override; diff --git a/llvm/test/MC/COFF/addrsig.s b/llvm/test/MC/COFF/addrsig.s --- a/llvm/test/MC/COFF/addrsig.s +++ b/llvm/test/MC/COFF/addrsig.s @@ -14,7 +14,7 @@ // CHECK-NEXT: IMAGE_SCN_LNK_REMOVE (0x800) // CHECK-NEXT: ] // CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 080A0B02 +// CHECK-NEXT: 0000: 080C0F02 // CHECK-NEXT: ) // CHECK: Symbols [ @@ -27,14 +27,41 @@ // CHECK: Name: .llvm_addrsig // CHECK: AuxSectionDef // CHECK: Name: g1 +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: IMAGE_SYM_UNDEFINED (0) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: WeakExternal (0x69) +// CHECK-NEXT: AuxSymbolCount: 1 +// CHECK-NEXT: AuxWeakExternal { +// CHECK-NEXT: Linked: .weak.g1.default (10) +// CHECK-NEXT: Search: Alias (0x3) // CHECK: Name: g2 // CHECK: Name: g3 +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: IMAGE_SYM_UNDEFINED (0) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: WeakExternal (0x69) +// CHECK-NEXT: AuxSymbolCount: 1 +// CHECK-NEXT: AuxWeakExternal { +// CHECK-NEXT: Linked: .weak.g3.default (14) +// CHECK-NEXT: Search: Alias (0x3) // CHECK: Name: local +// CHECK-NEXT: Value: 0 +// CHECK-NEXT: Section: IMAGE_SYM_UNDEFINED (0) +// CHECK-NEXT: BaseType: Null (0x0) +// CHECK-NEXT: ComplexType: Null (0x0) +// CHECK-NEXT: StorageClass: WeakExternal (0x69) +// CHECK-NEXT: AuxSymbolCount: 1 +// CHECK-NEXT: AuxWeakExternal { +// CHECK-NEXT: Linked: .weak.local.default (17) +// CHECK-NEXT: Search: Alias (0x3) // CHECK: Addrsig [ // CHECK-NEXT: Sym: g1 (8) -// CHECK-NEXT: Sym: g3 (10) -// CHECK-NEXT: Sym: local (11) +// CHECK-NEXT: Sym: g3 (12) +// CHECK-NEXT: Sym: local (15) // CHECK-NEXT: Sym: .data (2) // CHECK-NEXT: ] diff --git a/llvm/test/MC/ELF/addrsig.s b/llvm/test/MC/ELF/addrsig.s --- a/llvm/test/MC/ELF/addrsig.s +++ b/llvm/test/MC/ELF/addrsig.s @@ -16,7 +16,7 @@ // CHECK-NEXT: AddressAlignment: 1 // CHECK-NEXT: EntrySize: 0 // CHECK-NEXT: SectionData ( -// CHECK-NEXT: 0000: 03050201 +// CHECK-NEXT: 0000: 02040501 // CHECK-NEXT: ) // CHECK-NEXT: } // CHECK-NEXT: Section { @@ -34,16 +34,16 @@ // CHECK-NEXT: Section: [[SEC:.*]] // CHECK-NEXT: } // CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: local +// CHECK-NEXT: Name: g1 // CHECK-NEXT: Value: // CHECK-NEXT: Size: -// CHECK-NEXT: Binding: +// CHECK-NEXT: Binding: Weak // CHECK-NEXT: Type: // CHECK-NEXT: Other: -// CHECK-NEXT: Section: [[SEC]] +// CHECK-NEXT: Section: // CHECK-NEXT: } // CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: g1 +// CHECK-NEXT: Name: g2 // CHECK-NEXT: Value: // CHECK-NEXT: Size: // CHECK-NEXT: Binding: @@ -52,21 +52,28 @@ // CHECK-NEXT: Section: // CHECK-NEXT: } // CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: g2 +// CHECK-NEXT: Name: g3 // CHECK-NEXT: Value: // CHECK-NEXT: Size: -// CHECK-NEXT: Binding: +// CHECK-NEXT: Binding: Weak // CHECK-NEXT: Type: // CHECK-NEXT: Other: // CHECK-NEXT: Section: // CHECK-NEXT: } // CHECK-NEXT: Symbol { -// CHECK-NEXT: Name: g3 +// CHECK-NEXT: Name: local +// CHECK-NEXT: Value: +// CHECK-NEXT: Size: +// CHECK-NEXT: Binding: Weak +// CHECK-NEXT: Type: +// CHECK-NEXT: Other: +// CHECK-NEXT: Section: [[SEC]] +// CHECK-NEXT: } // CHECK: Addrsig [ -// CHECK-NEXT: Sym: g1 (3) -// CHECK-NEXT: Sym: g3 (5) -// CHECK-NEXT: Sym: local (2) +// CHECK-NEXT: Sym: g1 (2) +// CHECK-NEXT: Sym: g3 (4) +// CHECK-NEXT: Sym: local (5) // CHECK-NEXT: Sym: (1) // CHECK-NEXT: ]