]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
ld, LoongArch: print error about linking without -fPIC or -fPIE flag in more detail
authorXin Wang <wangxin03@loongson.cn>
Fri, 1 Nov 2024 11:41:49 +0000 (19:41 +0800)
committerliuzhensong <liuzhensong@loongson.cn>
Mon, 11 Nov 2024 04:02:35 +0000 (12:02 +0800)
bfd/elfnn-loongarch.c
ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.d [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.s [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.d [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.s [new file with mode: 0644]
ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp

index cc60eb6cacb124138df175b492f2a1f7757db492..608d179c168ecef46d8440abd389a8207fe1d21d 100644 (file)
@@ -856,13 +856,15 @@ loongarch_tls_transition (bfd *input_bfd,
 }
 
 static bool
-bad_static_reloc (bfd *abfd, const Elf_Internal_Rela *rel, asection *sec,
-                 unsigned r_type, struct elf_link_hash_entry *h,
+bad_static_reloc (struct bfd_link_info *info,
+                 bfd *abfd, const Elf_Internal_Rela *rel,
+                 asection *sec, unsigned r_type,
+                 struct elf_link_hash_entry *h,
                  Elf_Internal_Sym *isym)
 {
-  /* We propably can improve the information to tell users that they should
-     be recompile the code with -fPIC or -fPIE, just like what x86 does.  */
   reloc_howto_type * r = loongarch_elf_rtype_to_howto (abfd, r_type);
+  const char *object;
+  const char *pic;
   const char *name = NULL;
 
   if (h)
@@ -874,10 +876,24 @@ bad_static_reloc (bfd *abfd, const Elf_Internal_Rela *rel, asection *sec,
   if (name == NULL || *name == '\0')
     name ="<nameless>";
 
+  if (bfd_link_dll (info))
+    {
+      object = _("a shared object");
+      pic = _("; recompile with -fPIC");
+    }
+  else
+    {
+      if (bfd_link_pie (info))
+       object = _("a PIE object");
+      else
+       object = _("a PDE object");
+      pic = _("; recompile with -fPIE");
+    }
+
   (*_bfd_error_handler)
    (_("%pB:(%pA+%#lx): relocation %s against `%s` can not be used when making "
-      "a shared object; recompile with -fPIC"),
-    abfd, sec, (long) rel->r_offset, r ? r->name : _("<unknown>"), name);
+      "%s%s"),
+    abfd, sec, (long) rel->r_offset, r ? r->name : _("<unknown>"), name, object, pic);
   bfd_set_error (bfd_error_bad_value);
   return false;
 }
@@ -1047,7 +1063,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
        case R_LARCH_TLS_LE_HI20_R:
        case R_LARCH_SOP_PUSH_TLS_TPREL:
          if (!bfd_link_executable (info))
-           return bad_static_reloc (abfd, rel, sec, r_type, h, isym);
+           return bad_static_reloc (info, abfd, rel, sec, r_type, h, isym);
 
          if (!loongarch_elf_record_tls_and_got_reference (abfd, info, h,
                                                           r_symndx,
@@ -1065,7 +1081,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
 
        case R_LARCH_ABS_HI20:
          if (bfd_link_pic (info))
-           return bad_static_reloc (abfd, rel, sec, r_type, h, isym);
+           return bad_static_reloc (info, abfd, rel, sec, r_type, h, isym);
 
          /* Fall through.  */
        case R_LARCH_SOP_PUSH_ABSOLUTE:
@@ -1087,7 +1103,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
              && (sec->flags & SEC_ALLOC) != 0
              && (sec->flags & SEC_READONLY) != 0
              && ! LARCH_REF_LOCAL (info, h))
-           return bad_static_reloc (abfd, rel, sec, r_type, h, NULL);
+           return bad_static_reloc (info, abfd, rel, sec, r_type, h, NULL);
 
          break;
 
@@ -1115,7 +1131,7 @@ loongarch_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
              && (sec->flags & SEC_ALLOC) != 0
              && (sec->flags & SEC_READONLY) != 0
              && ! LARCH_REF_LOCAL (info, h))
-           return bad_static_reloc (abfd, rel, sec, r_type, h, NULL);
+           return bad_static_reloc (info, abfd, rel, sec, r_type, h, NULL);
 
          break;
 
diff --git a/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.d b/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.d
new file mode 100644 (file)
index 0000000..5dc2f7c
--- /dev/null
@@ -0,0 +1,4 @@
+#name: PC-relative relocation making executable
+#source: bad_pcala_hi20_global_pie.s
+#ld: -pie -z undefs --defsym _start=0
+#error: .*: relocation R_LARCH_PCALA_HI20 against `sym` can not be used when making a PIE object; recompile with -fPIE
diff --git a/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.s b/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.s
new file mode 100644 (file)
index 0000000..f07bff9
--- /dev/null
@@ -0,0 +1,3 @@
+    .global sym
+main:
+    la.pcrel $a0, sym
diff --git a/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.d b/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.d
new file mode 100644 (file)
index 0000000..5515f25
--- /dev/null
@@ -0,0 +1,4 @@
+#name: PC-relative relocation making executable
+#source: bad_pcala_hi20_weak_pie.s
+#ld: -pie --defsym _start=0
+#error: .*: relocation R_LARCH_PCALA_HI20 against `sym` can not be used when making a PIE object; recompile with -fPIE
diff --git a/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.s b/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.s
new file mode 100644 (file)
index 0000000..43abe59
--- /dev/null
@@ -0,0 +1,3 @@
+    .weak sym
+main:
+    la.pcrel $a0, sym
index 4e0068d9f899b3bd6615890c51ff92b6072c6178..3313f72eee419818cd0209fd767532126a581764 100644 (file)
@@ -168,6 +168,8 @@ if [istarget "loongarch64-*-*"] {
     run_dump_test "abssym_shared"
     run_dump_test "bad_pcala_hi20_global"
     run_dump_test "bad_pcala_hi20_weak"
+    run_dump_test "bad_pcala_hi20_global_pie"
+    run_dump_test "bad_pcala_hi20_weak_pie"
     run_dump_test "bad_pcrel20_s2_global"
     run_dump_test "bad_pcrel20_s2_weak"
   }