]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
LoongArch: The symbol got type can only be obtained after initialization
authorLulu Cai <cailulu@loongson.cn>
Fri, 19 Apr 2024 02:24:52 +0000 (10:24 +0800)
committerliuzhensong <liuzhensong@loongson.cn>
Thu, 25 Apr 2024 01:21:19 +0000 (09:21 +0800)
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

index 7b493f6f05b569e5c2127f131d90bb2d9d388760..fe780e3961095b3d09edc46070876829481c4e5a 100644 (file)
@@ -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))