aboutsummaryrefslogtreecommitdiff
path: root/bfd/elfnn-loongarch.c
diff options
context:
space:
mode:
authorXi Ruoyao <xry111@xry111.site>2024-12-25 12:41:45 +0800
committercailulu <cailulu@loongson.cn>2024-12-27 17:52:29 +0800
commite2cbacaec110371172969e756ed7ab758d04c797 (patch)
treed8d8aa765a4aebe169e1ebe24b76cc17d069b319 /bfd/elfnn-loongarch.c
parentc1a964051be5471d91bfe7655155948ab9c653f8 (diff)
downloadbinutils-e2cbacaec110371172969e756ed7ab758d04c797.zip
binutils-e2cbacaec110371172969e756ed7ab758d04c797.tar.gz
binutils-e2cbacaec110371172969e756ed7ab758d04c797.tar.bz2
LoongArch: Reword message for unresolvable relocs
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>
Diffstat (limited to 'bfd/elfnn-loongarch.c')
-rw-r--r--bfd/elfnn-loongarch.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index 9d3c0ee..47467b4 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -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;
}