[PATCH v1] ld, LoongArch: print error about linking without -fPIC or -fPIE flag in more detail

Lulu Cai cailulu@loongson.cn
Tue Nov 12 01:06:45 GMT 2024


On 11/8/24 9:11 AM, Lulu Cai wrote:
> Thanks, I think the revision is OK, and I'll push it later if no one 
> else comments.
>

The patch has been applied, thanks.

> On 11/1/24 7:41 PM, Xin Wang wrote:
>> ---
>>   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 ="<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 mailing list