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.htmlE o patch indicado em,
https://sourceware.org/ml/binutils/2012-04/msg00228.htmlAcabou 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 ?