Jeremie Courreges-Anglas writes:

> On Wed, Dec 19 2018, Xiyue Deng <manp...@gmail.com> wrote:
>> Xiyue Deng writes:
>>
>>> Hi,
>>>
>>> As title suggests, qtbase on -stable fails to build.  Relevant part from
>>> build log:
>>>
>>> /usr/bin/ld: BFD 2.17 assertion fail 
>>> /usr/src/gnu/usr.bin/binutils-2.17/bfd/elf64-mips.c:2254
>>> /usr/bin/ld: BFD 2.17 internal error, aborting at 
>>> /usr/src/gnu/usr.bin/binutils-2.17/bfd/reloc.c line 445 in 
>>> bfd_get_reloc_size
>>>
>>> /usr/bin/ld: Please report this bug.
>>>
>>> clang-6.0: error: linker command failed with exit code 1 (use -v to see 
>>> invocation)
>>>
>>> Full build log is also attached.  Please advice on how to fix.  Thanks!
>>
>> Hi,
>>
>> Any updates on this issue?
>
> Your initial mail was two/three days ago.  I would not expect someone to
> jump on obscure binutils problems on a non-mainstream arch.  ;)
>
> Now, you got me curious.

Sorry to sound pushy here, but somehow it worked :D

> Tentative analysis below, take with a grain of
> salt.
>
> Here's the code at
> /usr/src/gnu/usr.bin/binutils-2.17/bfd/elf64-mips.c:2254:
> --8<--
> /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
>
> static reloc_howto_type *
> mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
> {
>   switch (r_type)
>     {
>     case R_MIPS_GNU_VTINHERIT:
>       return &elf_mips_gnu_vtinherit_howto;
>     case R_MIPS_GNU_VTENTRY:
>       return &elf_mips_gnu_vtentry_howto;
>     case R_MIPS_GNU_REL16_S2:
>       if (rela_p)
>       return &elf_mips_gnu_rela16_s2;
>       else
>       return &elf_mips_gnu_rel16_s2;
>     default:
>       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
>       {
>         if (rela_p)
>           return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
>         else
>           return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
>       }
>       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
>       if (rela_p)
>       return &mips_elf64_howto_table_rela[r_type];
>       else
>       return &mips_elf64_howto_table_rel[r_type];
>       break;
>     }
> }
> -->8--
>
> As far as binutils-2.17 know, R_MIPS_max is 51:
>
>   include/elf/mips.h
>   90:  FAKE_RELOC (R_MIPS_max, 51)
>
> But llvm/clang adds support for additional relocation types, at least:
> --8<--
> ELF_RELOC(R_MIPS_PC21_S2,            60)
> ELF_RELOC(R_MIPS_PC26_S2,            61)
> ELF_RELOC(R_MIPS_PC18_S3,            62)
> ELF_RELOC(R_MIPS_PC19_S2,            63)
> ELF_RELOC(R_MIPS_PCHI16,             64)
> ELF_RELOC(R_MIPS_PCLO16,             65)
> -->8--
> listed in /usr/src/gnu/llvm/include/llvm/BinaryFormat/ELFRelocs/Mips.def
> for base clang.
>
> To make llvm more useful on mips64 one should either try to somehow
> avoid using those relocations, or add support for those relocations to
> binutils-2.17.

Apparently I'm pretty far from being qualified to do something like
this.  But MIPS just got open source, so maybe helps are coming.

>
> You could try applying this diff to see which relocation triggers the
> assert.
>
> My two cents,
>
>
> Index: elf64-mips.c
> ===================================================================
> RCS file: /cvs/src/gnu/usr.bin/binutils-2.17/bfd/elf64-mips.c,v
> retrieving revision 1.1.1.1
> diff -u -p -p -u -r1.1.1.1 elf64-mips.c
> --- elf64-mips.c      24 Apr 2011 20:14:42 -0000      1.1.1.1
> +++ elf64-mips.c      19 Dec 2018 17:22:29 -0000
> @@ -2252,6 +2252,8 @@ mips_elf64_rtype_to_howto (unsigned int
>           return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
>       }
>        BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
> +      if (!(r_type < (unsigned int) R_MIPS_max))
> +           fprintf(stderr, "BFD:%s: relocation type %u\n", __func__, r_type);
>        if (rela_p)
>       return &mips_elf64_howto_table_rela[r_type];
>        else

Thanks for the detailed explanation!  Will try your patch and report back.

--
manphiz

Reply via email to