On Wed, Dec 19 2018, Xiyue Deng <[email protected]> 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. 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.
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
--
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE