From: Jinyang He Date: Mon, 8 Jul 2024 03:27:52 +0000 (+0800) Subject: LoongArch: Not alloc dynamic relocs if symbol is absolute X-Git-Tag: binutils-2_43~159 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b357aca7494f96cf3cb95f401f1614806b7071c6;p=thirdparty%2Fbinutils-gdb.git LoongArch: Not alloc dynamic relocs if symbol is absolute The absolute symbol should be resolved to const when link to dso or exe. Alloc dynamic relocs will cause extra space and R_LARCH_NONE finally. --- diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index 06eec0ded6e..db6d419a052 100644 --- a/bfd/elfnn-loongarch.c +++ b/bfd/elfnn-loongarch.c @@ -899,6 +899,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, unsigned int r_type; unsigned int r_symndx; struct elf_link_hash_entry *h; + bool is_abs_symbol = false; Elf_Internal_Sym *isym = NULL; r_symndx = ELFNN_R_SYM (rel->r_info); @@ -917,6 +918,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, if (isym == NULL) return false; + is_abs_symbol = isym->st_shndx == SHN_ABS; if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC) { h = elfNN_loongarch_get_local_sym_hash (htab, abfd, rel, true); @@ -935,6 +937,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, while (h->root.type == bfd_link_hash_indirect || h->root.type == bfd_link_hash_warning) h = (struct elf_link_hash_entry *) h->root.u.i.link; + is_abs_symbol = bfd_is_abs_symbol (&h->root); } /* It is referenced by a non-shared object. */ @@ -1142,13 +1145,6 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, && bfd_link_pic (info) && (sec->flags & SEC_ALLOC) != 0) { - bool is_abs_symbol = false; - - if (r_symndx < symtab_hdr->sh_info) - is_abs_symbol = isym->st_shndx == SHN_ABS; - else - is_abs_symbol = bfd_is_abs_symbol (&h->root); - if (!is_abs_symbol) { _bfd_error_handler @@ -1165,6 +1161,10 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info, case R_LARCH_JUMP_SLOT: case R_LARCH_64: + /* Resolved to const. */ + if (is_abs_symbol) + break; + need_dynreloc = 1; /* If resolved symbol is defined in this object, diff --git a/ld/testsuite/ld-loongarch-elf/abssym.s b/ld/testsuite/ld-loongarch-elf/abssym.s new file mode 100644 index 00000000000..3eacc766054 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/abssym.s @@ -0,0 +1,3 @@ +.section .data,"aw" +.quad _size8 +.word _size4 diff --git a/ld/testsuite/ld-loongarch-elf/abssym_pie.d b/ld/testsuite/ld-loongarch-elf/abssym_pie.d new file mode 100644 index 00000000000..dfc3e35b2d0 --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/abssym_pie.d @@ -0,0 +1,6 @@ +#source: abssym.s +#ld: -pie -e 0 --defsym _size8=0 --defsym _size4=0 +#readelf: -r +#... +There are no relocations in this file. +#... diff --git a/ld/testsuite/ld-loongarch-elf/abssym_shared.d b/ld/testsuite/ld-loongarch-elf/abssym_shared.d new file mode 100644 index 00000000000..2db7e890c6d --- /dev/null +++ b/ld/testsuite/ld-loongarch-elf/abssym_shared.d @@ -0,0 +1,6 @@ +#source: abssym.s +#ld: -shared --defsym _size8=0 --defsym _size4=0 +#readelf: -r +#... +There are no relocations in this file. +#... diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp index 4606ede9fc0..fb34eeb80cb 100644 --- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp +++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp @@ -141,6 +141,7 @@ if [istarget "loongarch64-*-*"] { run_dump_test "relr-discard-shared" run_dump_test "relr-got-shared" run_dump_test "relr-text-shared" + run_dump_test "abssym_shared" } if [check_pie_support] { @@ -149,6 +150,7 @@ if [istarget "loongarch64-*-*"] { run_dump_test "relr-discard-pie" run_dump_test "relr-got-pie" run_dump_test "relr-text-pie" + run_dump_test "abssym_pie" } run_dump_test "max_imm_b16"