From 599df6e2db17d1c4be94522fbd4da3d56d5c5515 Mon Sep 17 00:00:00 2001 From: Xin Wang Date: Fri, 1 Nov 2024 19:41:49 +0800 Subject: [PATCH] ld, LoongArch: print error about linking without -fPIC or -fPIE flag in more detail --- bfd/elfnn-loongarch.c | 36 +++++++++++++------ .../bad_pcala_hi20_global_pie.d | 4 +++ .../bad_pcala_hi20_global_pie.s | 3 ++ .../bad_pcala_hi20_weak_pie.d | 4 +++ .../bad_pcala_hi20_weak_pie.s | 3 ++ .../ld-loongarch-elf/ld-loongarch-elf.exp | 2 ++ 6 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.d create mode 100644 ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_global_pie.s create mode 100644 ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.d create mode 100644 ld/testsuite/ld-loongarch-elf/bad_pcala_hi20_weak_pie.s 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 =""; + 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 : _(""), name); + "%s%s"), + abfd, sec, (long) rel->r_offset, r ? r->name : _(""), 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" } -- 2.39.5