diff options
-rw-r--r-- | bfd/elfnn-loongarch.c | 14 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/abssym.s | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/abssym_pie.d | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/abssym_shared.d | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp | 2 |
5 files changed, 24 insertions, 7 deletions
diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c index 06eec0d..db6d419 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 0000000..3eacc76 --- /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 0000000..dfc3e35 --- /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 0000000..2db7e89 --- /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 4606ede..fb34eeb 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" |