mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-06 14:21:43 +08:00
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>
This commit is contained in:
parent
c1a964051b
commit
e2cbacaec1
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user