38 lines
1.5 KiB
Diff
38 lines
1.5 KiB
Diff
From 6f250e80b7445f58291c273adf8fa03c65939b43 Mon Sep 17 00:00:00 2001
|
|
From: Lulu Cai <cailulu@loongson.cn>
|
|
Date: Fri, 19 Apr 2024 10:24:52 +0800
|
|
Subject: [PATCH 081/123] 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.
|
|
---
|
|
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 70ef28f3..0a7caa2a 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))
|
|
--
|
|
2.33.0
|
|
|