]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
LoongArch: Reword message for unresolvable relocs
authorXi Ruoyao <xry111@xry111.site>
Wed, 25 Dec 2024 04:41:45 +0000 (12:41 +0800)
committercailulu <cailulu@loongson.cn>
Fri, 27 Dec 2024 09:52:29 +0000 (17:52 +0800)
For PDE, "recompiling with -fPIE" just makes no sense.

For PIE, "recompiling with -fPIE" makes sense for unresolvable absolute
relocs, but not unresolveable PC-relative relocs: if the reloc is
already PC-relative, the problem is not the reloc is PC-relative or
absolute, but the reloc is not applicable for external symbols.

If we hit an unresolvable reloc in PDE or an unresolvable PC-relative
reloc in PIE, it means the programmer has somehow wrongly instructed the
compiler to treat external symbols as local symbols.  A misuse of
-mdirect-extern-access can cause the issue, so we can suggest
-mno-direct-extern-access.  And in all cases (DSO/PIE/PDE) a mismatching
symbol visibility can also cause the issue, so we should also suggest to
check the visibility.

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
bfd/elfnn-loongarch.c
ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global.d
ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.d
ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak.d
ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.d
ld/testsuite/ld-loongarch-elf/bad_pcrel20_s2_global.d
ld/testsuite/ld-loongarch-elf/bad_pcrel20_s2_weak.d

index 9d3c0eef5e35a32f85deb9070105e7ac6d7a4e28..47467b4ddf3c8afb186a296cd1aefcf0ddf923c7 100644 (file)
@@ -863,9 +863,17 @@ bad_static_reloc (struct bfd_link_info *info,
 {
   reloc_howto_type * r = loongarch_elf_rtype_to_howto (abfd, r_type);
   const char *object;
-  const char *pic;
+  const char *pic_opt;
   const char *name = NULL;
 
+  /* If this, the problem is we are referring an external symbol in
+     a way only working for local symbols, not PC-relative vs.
+        absolute.  */
+  bool bad_extern_access =
+    (bfd_link_pde (info)
+     || r_type == R_LARCH_PCREL20_S2
+     || r_type == R_LARCH_PCALA_HI20);
+
   if (h)
     name = h->root.root.string;
   else if (isym)
@@ -873,12 +881,12 @@ bad_static_reloc (struct bfd_link_info *info,
                                            elf_symtab_hdr (abfd).sh_link,
                                            isym->st_name);
   if (name == NULL || *name == '\0')
-    name ="<nameless>";
+    name = "<nameless>";
 
   if (bfd_link_dll (info))
     {
       object = _("a shared object");
-      pic = _("; recompile with -fPIC");
+      pic_opt = "-fPIC";
     }
   else
     {
@@ -886,13 +894,16 @@ bad_static_reloc (struct bfd_link_info *info,
        object = _("a PIE object");
       else
        object = _("a PDE object");
-      pic = _("; recompile with -fPIE");
+
+      pic_opt = bad_extern_access ? "-mno-direct-extern-access" : "-fPIE";
     }
 
   (*_bfd_error_handler)
    (_("%pB:(%pA+%#lx): relocation %s against `%s` can not be used when making "
-      "%s%s"),
-    abfd, sec, (long) rel->r_offset, r ? r->name : _("<unknown>"), name, object, pic);
+      "%s; recompile with %s%s"),
+    abfd, sec, (long) rel->r_offset, r ? r->name : _("<unknown>"), name,
+    object, pic_opt,
+    bad_extern_access ? _(" and check the symbol visibility") : "");
   bfd_set_error (bfd_error_bad_value);
   return false;
 }
index 6ecefd1d48aa83fc8c0f3455a2d4ce1d2d8ce575..4552ddf334fb4637e6e8724c3ee6ad0dacd86b28 100644 (file)
@@ -2,4 +2,4 @@
 #source: bad_pcala_hi20_global.s
 #target: [check_shared_lib_support]
 #ld: -shared --defsym global_a=0x10 --defsym global_b=0x20
-#error: .*: relocation R_LARCH_PCALA_HI20 against `global_b` can not be used when making a shared object; recompile with -fPIC
+#error: .*: relocation R_LARCH_PCALA_HI20 against `global_b` can not be used when making a shared object; recompile with -fPIC and check the symbol visibility
index 5dc2f7c4e4b53ab2331f4c91a41ceb02f3a060d5..a5cd359ac639233cfad9926e636cd439f8ac1c79 100644 (file)
@@ -1,4 +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
+#error: .*: relocation R_LARCH_PCALA_HI20 against `sym` can not be used when making a PIE object; recompile with -mno-direct-extern-access and check the symbol visibility
index cefc42cf89fd2998111f0ade915153b007ac7ce0..a39920875a04b1e7172c57acad1180988da65dfc 100644 (file)
@@ -2,4 +2,4 @@
 #source: bad_pcala_hi20_weak.s
 #target: [check_shared_lib_support]
 #ld: -shared --defsym global_a=0x10 --defsym global_b=0x20
-#error: .*: relocation R_LARCH_PCALA_HI20 against `global_b` can not be used when making a shared object; recompile with -fPIC
+#error: .*: relocation R_LARCH_PCALA_HI20 against `global_b` can not be used when making a shared object; recompile with -fPIC and check the symbol visibility
index 5515f2571918cb9a185f8813ca9cb33748a13a6a..62a3d8dae25f5ed6f24db515a80bcc7510963995 100644 (file)
@@ -1,4 +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
+#error: .*: relocation R_LARCH_PCALA_HI20 against `sym` can not be used when making a PIE object; recompile with -mno-direct-extern-access and check the symbol visibility
index 8e063dfb0ec3063e5c586652584b6ec56fed236d..d5a4cde420c25140c9b72e163319327a59c1f1e5 100644 (file)
@@ -2,4 +2,4 @@
 #source: bad_pcrel20_s2_global.s
 #target: [check_shared_lib_support]
 #ld: -shared --defsym global_a=0x10 --defsym global_b=0x20
-#error: .*: relocation R_LARCH_PCREL20_S2 against `global_b` can not be used when making a shared object; recompile with -fPIC
+#error: .*: relocation R_LARCH_PCREL20_S2 against `global_b` can not be used when making a shared object; recompile with -fPIC and check the symbol visibility
index 605df24988a3c5fd3549d1cb4b399b04ab231345..23b644339f9a5bf23b5d2ed2bcb492807dcc9c7a 100644 (file)
@@ -2,4 +2,4 @@
 #source: bad_pcrel20_s2_weak.s
 #target: [check_shared_lib_support]
 #ld: -shared --defsym global_a=0x10 --defsym global_b=0x20
-#error: .*: relocation R_LARCH_PCREL20_S2 against `global_b` can not be used when making a shared object; recompile with -fPIC
+#error: .*: relocation R_LARCH_PCREL20_S2 against `global_b` can not be used when making a shared object; recompile with -fPIC and check the symbol visibility