[binutils-gdb/binutils-2_42-branch] LoongArch: The symbol got type can only be obtained after initialization
liu & zhensong
liuzhensong@sourceware.org
Thu Oct 24 02:47:43 GMT 2024
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9055fbe5ffbbb8f7ea17d8e4c8ffdc0438038f67
commit 9055fbe5ffbbb8f7ea17d8e4c8ffdc0438038f67
Author: Lulu Cai <cailulu@loongson.cn>
Date: Fri Apr 19 10:24:52 2024 +0800
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.
(cherry picked from commit b221bff7c7ca20d961a7e6b663a545384054a5be)
Diff:
---
bfd/elfnn-loongarch.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index b6e62f0f795..08a4357d4b9 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -656,7 +656,14 @@ loongarch_can_trans_tls (bfd *input_bfd,
&& ELFNN_R_TYPE (rel[1].r_info) == R_LARCH_RELAX))
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))
More information about the Binutils-cvs
mailing list