From: Lulu Cai Date: Fri, 19 Apr 2024 02:24:52 +0000 (+0800) Subject: LoongArch: The symbol got type can only be obtained after initialization X-Git-Tag: gdb-15-branchpoint~256 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b221bff7c7ca20d961a7e6b663a545384054a5be;p=thirdparty%2Fbinutils-gdb.git LoongArch: The symbol got type can only be obtained after initialization When scanning relocations and determining whether TLS type transition is possible, it will try to obtain the symbol got type. If the symbol got type record has not yet been allocated space and initialized, it will cause ld to crash. So when uninitialized, the symbol is set to GOT_UNKNOWN. --- diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index 7b493f6f05b..fe780e39610 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -683,7 +683,14 @@ loongarch_can_trans_tls (bfd *input_bfd, if (! IS_LOONGARCH_TLS_TRANS_RELOC (r_type)) return false; - symbol_tls_type = _bfd_loongarch_elf_tls_type (input_bfd, h, r_symndx); + /* Obtaining tls got type here may occur before + loongarch_elf_record_tls_and_got_reference, so it is necessary + to ensure that tls got type has been initialized, otherwise it + is set to GOT_UNKNOWN. */ + symbol_tls_type = GOT_UNKNOWN; + if (_bfd_loongarch_elf_local_got_tls_type (input_bfd) || h) + symbol_tls_type = _bfd_loongarch_elf_tls_type (input_bfd, h, r_symndx); + reloc_got_type = loongarch_reloc_got_type (r_type); if (symbol_tls_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (reloc_got_type))