Compilação cruzada GLIBC para meu ARM SoC

13

Estou vendo algo realmente estranho dentro de um armelambiente Debian com chroot .

Mas primeiro, um pouco da história de fundo ... Isso é longo, mas a pergunta é complexa e qualquer ajuda em potencial depende do conhecimento da história completa.

Eu tenho um ARM SoC incorporado que executa o Linux - mais especificamente, um Debian armelLenny em um kernel 2.6.17. A distribuição Debian em si é facilmente atualizável para versões posteriores ( sudo apt-get dist-upgrade) e, portanto, pode ser atualizada, para as armelversões squeezeou mesmo wheezy.

O problema é que o kernel é personalizado ... O ARM SoC em questão não faz parte do kernel da linha principal, portanto é praticamente abandonado na 2.6.17.

Se você sabe como o Linux e o GLIBC funcionam, já pode ver o problema - as versões do GLIBC são compiladas com uma versão mínima suportada do kernel ... Que foi além da 2.6.17. Portanto, se tentarmos, por exemplo, chroot para um aperto do Debian ...

$ # From inside the little ARM machine running Debian Lenny
$ sudo debootstrap --arch armel squeeze /squeeze \
     http://ftp.whateverCountry.debian.org/debian
$ sudo -i
# mount -t proc none /squeeze/proc
# mount -t sysfs none /squeeze/sys
# mount -t devpts none /squeeze/dev/pts
# chroot /squeeze
Fatal: Kernel too old

... vemos uma mensagem do GLIBC de squeeze, informando que não foi compilado para trabalhar com este kernel antigo (2.6.17).

O mesmo problema também acontece com o wheezy - já que é mais novo que o squeeze - e de fato acontecerá com qualquer versão do Debian a partir de agora, já que o GLIBC não funcionará no meu kernel 2.6.17.

No começo, pensei que isso era um rompimento de acordos - mas então percebi que, em teoria, recompilei o GLIBC para trabalhar com o kernel mais antigo que meu SoC está usando ... Mas eu precisaria de um ambiente idêntico ao usado para criar a libc6 pacote, por exemplo, no Debian squeeze.

Eu estou supondo que a compilação do GLIBC e a preparação do arquivo libc6_2.11.3-4.deb sejam feitas através de máquinas automáticas de compilação cruzada inventadas pelos deuses do Debian.

Eu não sou Deus ... nem encontrei nada no Google sobre como se tornar um - ou seja, como usar o Core i5 como host, para compilar o GLIBC usando exatamente as mesmas configurações da versão em pacote (dentro do Debian squeeze) usando.

Então, eu o enganei - eu descobri como configurar a versão ARM do Debian squeeze no meu Core i5 (uma técnica que usa uma versão estática do qemu-armbinário).

Depois de fazer o chroot na minha versão hospedada em x86 Debian-armel-squeeze, consegui simplesmente ...

$ cd /var/tmp
$ apt-get source libc6
...
$ # edit this in - compile for my kernel...
$ vi eglibc-2.11.3/debian/sysdeps/linux.mk
...
MIN_KERNEL_SUPPORTED := 2.6.17
...
$ export DEB_BUILD_OPTS="nocheck parallel=1"
$ cd eglibc-2.11.3
$ dpkg-buildpackage -b -d -us -uc

... e após 3 horas (a versão chroot hospedada no Core i5 Debian-armel-squeezeé muito mais lenta que uma máquina nativa ...), recebi meu pacote libc6 .deb. Provavelmente levaria três meses para fazer essa compilação no meu SoC, então não estou reclamando.

Voltando ao meu verdadeiro ARM SoC, copiei todos os arquivos libc (.so) do novo pacote sobre os arquivos padrão do squeeze e tentei chroot ...

# chroot squeeze/
root@ttsiodras:/# 

Sim! Funcionou! (ou assim parecia)

Minha libc personalizada relatada de dentro do chroot:

# /lib/libc.so.6 
GNU C Library (Debian EGLIBC 2.11.3-4) stable release version 2.11.3, by Roland McGrath et al.
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.4.5.
Compiled on a Linux 2.6.26 system on 2014-10-23.
Available extensions:
        crypt add-on version 2.1 by Michael Glad and others
        GNU Libidn by Simon Josefsson
        Native POSIX Threads Library by Ulrich Drepper et al
        Support for some architectures added on, not maintained in glibc core.
        BIND-8.2.3-T5B
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.

As coisas pareciam funcionar - copiei um arquivo, invoquei ls...

Mas quando tentei usar apt-getpara instalar alguns aplicativos squeeze, comecei a receber ... alguns erros inesperados:

# apt-get install indent
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  indent
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 110 kB of archives.
After this operation, 516 kB of additional disk space will be used.
Get:1 http://ftp.gr.debian.org/debian/ squeeze/main indent armel 2.2.11-1 [110 kB]
Fetched 110 kB in 0s (236 kB/s)

tar: ./control: Cannot utime: Function not implemented
tar: ./md5sums: Cannot utime: Function not implemented
tar: .: Cannot utime: Function not implemented
tar: Exiting with failure status due to previous errors

dpkg-deb: subprocess tar returned error exit status 2
dpkg: error processing /var/cache/apt/archives/indent_2.2.11-1_armel.deb (--unpack):
 subprocess dpkg-deb --control returned error exit status 2
configured to not write apport reports

rm: cannot remove `/var/lib/dpkg/tmp.ci': Function not implemented

dpkg: error while cleaning up:
 subprocess rm cleanup returned error exit status 1
Errors were encountered while processing:
 /var/cache/apt/archives/indent_2.2.11-1_armel.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

Oh-oh ... um monte de Function not implemented. Parece o GLIBC relatando que coisas básicas não estão funcionando ...

Eu consegui strace (não pergunte como) e descobri que todas as -atfunções estão falhando: openat, mkdirat, renameat, etc - todos eles são ENOSYS relatórios.

Parece que tive sucesso apenas parcialmente - algumas chamadas do sistema estão falhando no meu novo GLIBC.

É impossível compilar um squeezeou wheezeGLIBC para executar sob 2.6.17?

Quaisquer ideias / sugestões sobre o que fiz de errado e / ou como proceder serão muito apreciadas ...

ttsiodras
fonte
Configurar um compilador cruzado não é tão difícil e existem tutoriais na Web para isso. Será significativamente mais rápido do que executar o compilador no Qemu. Não sei se isso ajudará a libc resultante não funcionar.
Gilles 'SO- stop be evil'
@ Gilles: Quanto aos "tutoriais" - você pode apontar para algo específico? Eu tentei o crosstool-ng, mas ele não vem da versão do kernel de destino (2.6.17). Eu acho que isso é relevante - glibc deve ser compilado com cabeçalhos do meu kernel (talvez isso é o que está causando meus problemas no meu "-ARM baseado" de construção ...)
ttsiodras

Respostas:

7

Eu fiz isso :-)

Basicamente, segui o conselho de Gilles e decidi fazê-lo corretamente: ou seja, gerenciar uma compilação cruzada completa do GLIBC. Comecei do crosstool-ng e fiquei inicialmente decepcionado - vendo que ele não suportava o meu kernel antigo. Eu continuei nisso - editando manualmente o arquivo de configuração salvo pelo crosstool-ng para fazer alterações como estas na configuração de compilação arm-gnueabi padrão:

$ ct-ng arm-unknown-linux-gnueabi
$ ct-ng menuconfig
...
$ vi .config
$ cat .config
...
CT_KERNEL_VERSION="2.6.17"
CT_KERNEL_V_2_6_17=y
CT_LIBC_VERSION="2.13"
CT_LIBC_GLIBC_V_2_13=y
CT_LIBC_GLIBC_MIN_KERNEL_VERSION="2.6.9"
CT_LIBC_GLIBC_MIN_KERNEL="2.6.9
...
$ ct-ng +libc

Após vários testes e tentativas fracassadas, as alterações acima foram feitas - eu obtive uma versão compilada do GLIBC que funcionaria com meu kernel e copiei os arquivos resultantes na minha máquina Debian Lenny ARM:

$ cd .build/arm-unknown-linux-gnueabi/build/build-libc-final/
$ tar zcpf newlibc.tgz $(find . -type f -iname \*.so)
$ scp newlibc.tgz root@mybook:.

Fui por todo o caminho e passei pelo aperto: desbooteiei o wheezy e depois - com muito cuidado - substitui as versões GLIBC do armel-debootstrapped /wheezycom as minhas:

# # In the ARM machine
# cd /wheezy/lib/arm-linux-gnueabi/
# mv /var/tmp/ohMyGod/libc.so libc-2.13.so
# mv /var/tmp/ohMyGod/rt/librt.so librt-2.13.so
...

... etc, certificando-se de que não perdi nenhuma biblioteca compartilhada.

Por fim, copiei os binários ldde ldconfig(que também faziam parte do GLIBC) e fiz o chroot dentro do meu / chiado.

Funcionou.

Só posso supor que a compilação do GLIBC a partir de uma emulação chemot 'qemu-arm' dentro de um x86, de alguma forma atrapalhou as coisas - talvez o configureprocesso detecte algumas coisas do ambiente em execução - enquanto a compilação cruzada não pode ser enganada .

Então, naturalmente, mudei para a próxima etapa e usei um shell estático do busybox para substituir as pastas {/ bin, / sbin, ...} do meu antigo lenny pelos wheezy - e reiniciei no meu novo Wheezy :-)

Por meio deste, afirmo que meu WD MyBook World Edition é o único no planeta executando o Debian Wheezy :-) Se alguém mais estiver interessado, eu posso enviar um arquivo tarc dos arquivos libc em algum lugar.

ttsiodras
fonte