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. 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