mips64 ld GOT problem

Stacey Son sson at FreeBSD.org
Fri Jul 25 22:29:18 UTC 2014


Hi Warner...

On Jul 25, 2014, at 11:26 AM, Warner Losh <imp at bsdimp.com> wrote:

> 
> On Jul 25, 2014, at 9:24 AM, Stacey Son <sson at me.com> wrote:
> 
>> Hi all:
>> 
>> I have been trying to bootstrap clang/llvm 3.5 for mips64 (i.e. cross build clang/llvm 3.5 for mips64 using clang/llvm 3.5) but run into the following linker problem (see below) in about the midway point as it is trying to link 'opt'.   The assertions that fail are the following:
>> 
>> BFD 2.17.50 [FreeBSD] 2007-07-03 assertion fail /usr/home/sson/freebsd/gnu/usr.bin/binutils/libbfd/../../../../contrib/binutils/bfd/elfxx-mips.c:7455
>> 
>>                 BFD_ASSERT (g->assigned_gotno - g->local_gotno
>>                             <= g->global_gotno);
>> 
>> BFD 2.17.50 [FreeBSD] 2007-07-03 assertion fail /usr/home/sson/freebsd/gnu/usr.bin/binutils/libbfd/../../../../contrib/binutils/bfd/elfxx-mips.c:2767
>> 
>> /* There should have been enough room in the symbol table to
>>    accommodate both the GOT and non-GOT symbols.  */
>> BFD_ASSERT (hsd.max_non_got_dynindx <= hsd.min_got_dynindx);
>> 
>> BFD 2.17.50 [FreeBSD] 2007-07-03 assertion fail /usr/home/sson/freebsd/gnu/usr.bin/binutils/libbfd/../../../../contrib/binutils/bfd/elfxx-mips.c:10282
>> 
>>     /* Make sure we didn't grow the global .got region.  */
>>     dynobj = elf_hash_table (info)->dynobj;
>>     got = mips_elf_got_section (dynobj, FALSE);
>>     g = mips_elf_section_data (got)->u.got_info;
>> 
>>     if (g->global_gotsym != NULL)
>>       BFD_ASSERT ((elf_hash_table (info)->dynsymcount
>>                    - g->global_gotsym->dynindx)
>>                   <= g->global_gotno);
>> 
>> Does anyone have an idea for a work around or fix?
> 
> Silly question: does using the latest binutils fix this problem?

Is there a stable port of the latest binutils to mips?  Does someone have some patches?  I did tried TheRaven's port of the 2.18 binutils but it seemed that 'ld' wasn't very happy.  It didn't like any of the object files I offered it.

> Failing that, perhaps we need to specify a larger GOT region that we do today?  IIRC, that’s specified with -g on the linker line, Try adding “-G0”. I have a vague recollection we always used to do this, but moved it to be a default (or maybe other systems have the default and we still need to add it). It doesn’t look like it is being added from the output that you’ve posted. IIRC, it has to be specified on all the compiler invocations as well.

Reading the man page implies  -Gvalue/--gpsize=value is only for ECOFF binaries.  I tried it anyway and it didn't seem to help.

-stacey.


More information about the freebsd-mips mailing list