Compare commits

..

10 commits

Author SHA1 Message Date
mengqinggang
bb9a0a36e7 LoongArch: Add relaxation support for call36 that jump to PLT entry
Part of commit a104f0a3e620 ("LoongArch: Add more relaxation support for
call36") in master.  This part is needed for 2.43 branch to fix a link
failure of QtWebEngine-6.8.1, which can be demonstrated with a reduced
test case (with -shared):

    .text
    .zero 1 << 27   # pretending we have a lot of code in .text
    .globl f        # preemptible, thus must be called via PLT
    f:
      move $a0, $r0
      ret
    g:
      pcaddu18i $t0, %call36(f)
      jr $t0

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
2024-12-30 09:40:14 +08:00
GDB Administrator
e17aa8bbd8 Automatic date update in version.in 2024-12-30 00:02:15 +00:00
GDB Administrator
2c1975500d Automatic date update in version.in 2024-12-29 00:01:52 +00:00
Xi Ruoyao
a8563dba75 LoongArch: Fix broken DESC => IE transition for 2.43 branch
If code compiled with -fPIC -mtls-dialect=desc is linked into a PDE or
PIE, and the code refers to external DSO symbols, we can produce broken
link unit as check_relocs expects DESC => IE transition to happen and
emits a TLS IE entry in the GOT, but a too early "continue" in
relax_section actually jumps over the DESC => IE transition so the code
sequence is unchanged and still expecting a TLS descriptor (instead of
an IE entry) in the GOT.

The bug is already fixed in master branch by commit 5c3d09c1855b
("LoongArch: Optimize the relaxation process") so this fix is only
needed for the 2.43 branch.

Reported-by: Icenowy Zheng <uwu@icenowy.me>
Closes: https://gcc.gnu.org/PR118114
Tested-by: Icenowy Zheng <uwu@icenowy.me>
Signed-off-by: Xi Ruoyao <xry111@xry111.site>
2024-12-28 16:28:27 +08:00
GDB Administrator
e2d776f7b9 Automatic date update in version.in 2024-12-28 00:02:36 +00:00
GDB Administrator
0cdfcb9b8c Automatic date update in version.in 2024-12-27 00:02:07 +00:00
GDB Administrator
923497873f Automatic date update in version.in 2024-12-26 00:01:55 +00:00
GDB Administrator
551c1430e5 Automatic date update in version.in 2024-12-25 00:00:52 +00:00
GDB Administrator
b194ae062e Automatic date update in version.in 2024-12-24 00:00:58 +00:00
GDB Administrator
33990e5ced Automatic date update in version.in 2024-12-23 00:01:14 +00:00
2 changed files with 29 additions and 23 deletions

View file

@ -5325,8 +5325,8 @@ loongarch_elf_relax_section (bfd *abfd, asection *sec,
for (unsigned int i = 0; i < sec->reloc_count; i++)
{
char symtype;
bfd_vma symval;
asection *sym_sec;
bfd_vma symval = 0; /* "= 0" for https://gcc.gnu.org/PR118216 */
asection *sym_sec = NULL;
bool local_got = false;
Elf_Internal_Rela *rel = relocs + i;
struct elf_link_hash_entry *h = NULL;
@ -5410,6 +5410,11 @@ loongarch_elf_relax_section (bfd *abfd, asection *sec,
&& GOT_TLS_GD_BOTH_P (tls_type))
symval += 2 * GOT_ENTRY_SIZE;
}
else if (h->plt.offset != MINUS_ONE)
{
sym_sec = htab->elf.splt ? htab->elf.splt : htab->elf.iplt;
symval = h->plt.offset;
}
else if ((h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& h->root.u.def.section != NULL
@ -5418,14 +5423,33 @@ loongarch_elf_relax_section (bfd *abfd, asection *sec,
symval = h->root.u.def.value;
sym_sec = h->root.u.def.section;
}
else
continue;
if (h && LARCH_REF_LOCAL (info, h))
local_got = true;
symtype = h->type;
}
/* If the conditions for tls type transition are met, type
transition is performed instead of relax.
During the transition from DESC->IE/LE, there are 2 situations
depending on the different configurations of the relax/norelax
option.
If the -relax option is used, the extra nops will be removed,
and this transition is performed in pass 0.
If the --no-relax option is used, nop will be retained, and
this transition is performed in pass 1. */
if (IS_LOONGARCH_TLS_TRANS_RELOC (r_type)
&& (i + 1 != sec->reloc_count)
&& ELFNN_R_TYPE (rel[1].r_info) == R_LARCH_RELAX
&& loongarch_can_trans_tls (abfd, info, h, r_symndx, r_type))
{
loongarch_tls_perform_trans (abfd, sec, rel, h, info);
r_type = ELFNN_R_TYPE (rel->r_info);
}
if (!sym_sec)
continue;
if (sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE
&& (sym_sec->flags & SEC_MERGE))
{
@ -5453,24 +5477,6 @@ loongarch_elf_relax_section (bfd *abfd, asection *sec,
symval += sec_addr (sym_sec);
/* If the conditions for tls type transition are met, type
transition is performed instead of relax.
During the transition from DESC->IE/LE, there are 2 situations
depending on the different configurations of the relax/norelax
option.
If the -relax option is used, the extra nops will be removed,
and this transition is performed in pass 0.
If the --no-relax option is used, nop will be retained, and
this transition is performed in pass 1. */
if (IS_LOONGARCH_TLS_TRANS_RELOC (r_type)
&& (i + 1 != sec->reloc_count)
&& ELFNN_R_TYPE (rel[1].r_info) == R_LARCH_RELAX
&& loongarch_can_trans_tls (abfd, info, h, r_symndx, r_type))
{
loongarch_tls_perform_trans (abfd, sec, rel, h, info);
r_type = ELFNN_R_TYPE (rel->r_info);
}
switch (r_type)
{
case R_LARCH_ALIGN:

View file

@ -16,7 +16,7 @@
In releases, the date is not included in either version strings or
sonames. */
#define BFD_VERSION_DATE 20241222
#define BFD_VERSION_DATE 20241230
#define BFD_VERSION @bfd_version@
#define BFD_VERSION_STRING @bfd_version_package@ @bfd_version_string@
#define REPORT_BUGS_TO @report_bugs_to@