[binutils-gdb] ld, LoongArch: print error about linking without -fPIC or -fPIE flag in more detail
liu & zhensong
liuzhensong@sourceware.org
Mon Nov 11 04:04:51 GMT 2024
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=599df6e2db17d1c4be94522fbd4da3d56d5c5515
commit 599df6e2db17d1c4be94522fbd4da3d56d5c5515
Author: Xin Wang <wangxin03@loongson.cn>
Date: Fri Nov 1 19:41:49 2024 +0800
ld, LoongArch: print error about linking without -fPIC or -fPIE flag in more detail
Diff:
---
bfd/elfnn-loongarch.c | 36 ++++++++++++++++------
.../ld-loongarch-elf/bad_pcala_hi20_global_pie.d | 4 +++
.../ld-loongarch-elf/bad_pcala_hi20_global_pie.s | 3 ++
.../ld-loongarch-elf/bad_pcala_hi20_weak_pie.d | 4 +++
.../ld-loongarch-elf/bad_pcala_hi20_weak_pie.s | 3 ++
ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp | 2 ++
6 files changed, 42 insertions(+), 10 deletions(-)
diff --git a/bfd/elfnn-loongarch.c b/bfd/elfnn-loongarch.c
index cc60eb6cacb..608d179c168 100644
--- a/bfd/elfnn-loongarch.c
+++ b/bfd/elfnn-loongarch.c
@@ -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
index 00000000000..5dc2f7c4e4b
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.d
@@ -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
index 00000000000..f07bff98496
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.s
@@ -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
index 00000000000..5515f257191
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.d
@@ -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
index 00000000000..43abe59ac35
--- /dev/null
+++ b/ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.s
@@ -0,0 +1,3 @@
+ .weak sym
+main:
+ la.pcrel $a0, sym
diff --git a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
index 4e0068d9f89..3313f72eee4 100644
--- a/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
+++ b/ld/testsuite/ld-loongarch-elf/ld-loongarch-elf.exp
@@ -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"
}
More information about the Binutils-cvs
mailing list