Erro ao linkar um programa numa máquina ARM - ld: assertion fail bfd/elf32-arm.c

Iniciado por Nosferatu Arucard, 13 de Dezembro de 2013, 17:37

tópico anterior - próximo tópico

Nosferatu Arucard

Quando estive a ajudar um amigo que têm uma máquina ARM programável, quando ele tenta compilar com o IDE Lazarus um software complexo com várias bibliotecas externas, a compilação do código Pascal corre bem, mas quando chega ao linker, falha...  >:(

Mais propriamente, ocorre dezenas de ocorrência da seguinte linha de erro no Terminal:
/usr/local/bin/ld.bfd: BFD (GNU Binutils for Debian) 2.24 assertion fail ../../bfd/elf32-arm.c:12387

Quando experimentei com uma máquina virtual ARM (como expliquei aqui http://ubuntuforum-br.org/index.php/topic,110370.0.html), ocorre o mesmo quer com a versão 2.23 do binutils do Ubuntu, do Debian 2.24 ou compilando a partir do código-fonte sem modificações.

O erro em si aparenta apontar para a seguinte função em C, contida no ficheiro elf32-arm.c:
12385           if (root_plt->refcount >= 0)
12386             {
12387               BFD_ASSERT (root_plt->refcount != 0);  //O problema está na avaliação da função BFD_ASSERT
12388               root_plt->refcount -= 1;
12389             }
12390           else
12391             /* A value of -1 means the symbol has become local, forced
12392                or seeing a hidden definition.  Any other negative value
12393                is an error.  */
12394             BFD_ASSERT (root_plt->refcount == -1);
12395
12396           if (!call_reloc_p)
12397             arm_plt->noncall_refcount--;
12398
12399           if (r_type == R_ARM_THM_CALL)
12400             arm_plt->maybe_thumb_refcount--;
12401
12402           if (r_type == R_ARM_THM_JUMP24
12403               || r_type == R_ARM_THM_JUMP19)
12404             arm_plt->thumb_refcount--;
12405         }

Contudo o problema já foi diagnosticado no passado (as linhas eram um bocado diferentes mas a função era a mesma), e devia já estar corrigido.  >:(
Até está na lista de problemas do compilador FPC!
http://lists.freepascal.org/lists/fpc-devel/2013-May/032179.html
E o patch indicado em,
https://sourceware.org/ml/binutils/2012-04/msg00228.html
Acabou por dar em absolutamente nada!  >:(

Quando o compilo o programa em Pascal para outras arquitecturas não ocorre nenhum problema, mas para ARM, a fase de linkagem falha precisamente por este erro!
Será necessário algum patch específico, re-compilar o binutils para ARM com -disable-Werror (para converter erros de runtime em warnings ?), ou isso trata-se de um bug mal resolvido do binutils ?