From: James Clarke Date: Mon, 20 Jan 2020 09:26:04 +0000 (+0000) Subject: [Sparc] Include __tls_get_addr in symbol table for TLS calls to it X-Git-Tag: archive/raspbian/1%6.0.1-12+rpi1^2~30 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=49cf07774d02c1d09bfd5f5316e6b1f2b87ba6b8;p=llvm-toolchain-6.0.git [Sparc] Include __tls_get_addr in symbol table for TLS calls to it Last-Update: 2018-02-14 Global Dynamic and Local Dynamic call relocations only implicitly reference __tls_get_addr, but it still needs to be in the symbol table to be bound at link time otherwise it fails to link. For details, see https://sourceware.org/bugzilla/show_bug.cgi?id=22832. Gbp-Pq: Name sparc64-add-missing-tls-get-addr.diff --- diff --git a/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp b/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp index a77f760d..7bc5c8b7 100644 --- a/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp +++ b/lib/Target/Sparc/MCTargetDesc/SparcMCExpr.cpp @@ -193,14 +193,30 @@ static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { void SparcMCExpr::fixELFSymbolsInTLSFixups(MCAssembler &Asm) const { switch(getKind()) { default: return; + case VK_Sparc_TLS_GD_CALL: + case VK_Sparc_TLS_LDM_CALL: { + // The corresponding relocations reference __tls_get_addr, as they call it, + // but this is only implicit; there is no connection in the ELF file + // between the relocation and the symbol, other than the specification for + // the semantics of the relocations. However, the symbol must be included + // in our symbol table despite the lack of references to it, since it needs + // to be bound during linking for these relocations. For details see + // https://sourceware.org/bugzilla/show_bug.cgi?id=22832. + MCSymbol *Symbol = Asm.getContext().getOrCreateSymbol("__tls_get_addr"); + Asm.registerSymbol(*Symbol); + auto ELFSymbol = cast(Symbol); + if (!ELFSymbol->isBindingSet()) { + ELFSymbol->setBinding(ELF::STB_GLOBAL); + ELFSymbol->setExternal(true); + } + LLVM_FALLTHROUGH; + } case VK_Sparc_TLS_GD_HI22: case VK_Sparc_TLS_GD_LO10: case VK_Sparc_TLS_GD_ADD: - case VK_Sparc_TLS_GD_CALL: case VK_Sparc_TLS_LDM_HI22: case VK_Sparc_TLS_LDM_LO10: case VK_Sparc_TLS_LDM_ADD: - case VK_Sparc_TLS_LDM_CALL: case VK_Sparc_TLS_LDO_HIX22: case VK_Sparc_TLS_LDO_LOX10: case VK_Sparc_TLS_LDO_ADD: