]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
LoongArch: Not alloc dynamic relocs if symbol is absolute
authorJinyang He <hejinyang@loongson.cn>
Mon, 8 Jul 2024 03:27:52 +0000 (11:27 +0800)
committerliuzhensong <liuzhensong@loongson.cn>
Thu, 11 Jul 2024 01:27:22 +0000 (09:27 +0800)
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.

bfd/elfnn-loongarch.c
ld/testsuite/ld-loongarch-elf/abssym.s [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/abssym_pie.d [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/abssym_shared.d [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp

index 06eec0ded6ee4628040d575a8a737de489675ebe..db6d419a052e6400f8a0c1f02d64822372c862ba 100644 (file)
@@ -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 (file)
index 0000000..3eacc76
--- /dev/null
@@ -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 (file)
index 0000000..dfc3e35
--- /dev/null
@@ -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 (file)
index 0000000..2db7e89
--- /dev/null
@@ -0,0 +1,6 @@
+#source: abssym.s
+#ld: -shared --defsym _size8=0 --defsym _size4=0
+#readelf: -r
+#...
+There are no relocations in this file.
+#...
index 4606ede9fc005a78cd2b4fa232b27669556e5823..fb34eeb80cbb812b728a83dbe7d747f5861a3312 100644 (file)
@@ -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"