Cross Compiling GLIBC para o meu SoC ARM

12

Estou vendo algo realmente estranho dentro de um ambiente Debian armel chroot.

Mas primeiro, um pouco de história de fundo ... Isso é longo, mas a questão é complexo e qualquer ajuda em potencial depende de saber a história completa.

Eu tenho um SoC ARM embutido que roda o Linux - mais especificamente, um Debian armel Lenny em um kernel 2.6.17. A distro Debian em si é facilmente atualizável para versões posteriores ( sudo apt-get dist-upgrade ) e pode assim ser atualizado, para as versões armel do squeeze ou até wheezy .

O problema é que o kernel é personalizado ... O ARM SoC em questão não faz parte do kernel da linha principal, por isso é bastante muito abandonado em 2.6.17.

Se você sabe como o Linux e o GLIBC funcionam, você já pode ver problema - versões GLIBC são compiladas com um mínimo suportado versão do kernel ... O que mudou depois do 2.6.17. Então, se nós tentarmos para p. chroot para um squeeze 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 , nos dizendo que não foi compilado para trabalhar com este kernel antigo (2.6.17).

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

No começo, eu achei que isso era um problema - mas depois percebi que eu posso em teoria recompilar GLIBC para trabalhar com os mais antigos kernel meu SoC está usando ... Mas eu preciso de um ambiente idêntico ao que foi usado para construir o pacote libc6 em, e. Debian squeeze.

Eu estou supondo que a compilação do GLIBC e a preparação do O arquivo libc6_2.11.3-4.deb é feito através de compilação automatizada maquinaria inventada pelos deuses do Debian.

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

Então eu enganei isso - eu descobri como configurar a versão ARM do Debian squeeze no meu Core i5 (uma técnica que usa uma versão do binário qemu-arm .

Depois que eu chrooted na minha versão hospedada em x86 de Debian-armel-squeeze , Eu fui capaz de 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 depois de 3 horas (a versão chrooted hospedada no Core i5 Debian-armel-squeeze é muito mais lento que uma máquina nativa ...) Eu tenho meu pacote libc6 .deb. Demoraria provavelmente 3 meses para fazer isso no meu SoC, então eu não estou reclamando.

Voltando para dentro do meu verdadeiro ARC SoC, eu copiei todos os arquivos libc (.so) do novo pacote sobre os padrões de squeeze e tentou chroot ...

# chroot squeeze/
root@ttsiodras:/# 

Sim! Funcionou! (ou assim parecia)

Minha libc customizada é reportada 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 - eu copiei um arquivo, invoquei ls ...

Mas quando tentei usar apt-get para instalar alguns aplicativos de 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 . Isso soa como o relatório do GLIBC que coisas básicas não estão funcionando ...

Consegui avaliar (não pergunte como) e descobri que todas as funções -at estão falhando: openat , mkdirat , renameat , etc - todos eles estão relatando ENOSYS.

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

É impossível compilar um squeeze ou wheeze GLIBC para executar sob 2.6.17?

Quaisquer idéias / indicações sobre o que eu fiz de errado e / ou como proceder seriam muito apreciadas ...

    
por ttsiodras 23.10.2014 / 13:31

1 resposta

6

Eu fiz isso: -)

Basicamente segui o conselho de Gilles e decidi fazê-lo corretamente: ou seja, gerenciar uma compilação completa de GLIBC. Eu comecei a partir do crosstool-ng e fiquei inicialmente desapontado - vendo que ele não suportava o meu kernel antigo. Eu continuei nisso - porém - editando manualmente o arquivo de configuração salvo pelo crosstool-ng para fazer mudanças como essas na configuração padrão de compilação do gnueabi:

$ 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 numerosos testes e tentativas fracassadas, as mudanças acima o fizeram - eu obtive uma versão compilada do GLIBC que trabalharia com meu kernel, e copiei os arquivos resultantes para 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:.

Eu fui até o fim e passei do squeeze: eu desboquei o / wheezy e então - com muito cuidado - substituí as versões do GLIBC do armel-debootstrapped /wheezy pelo meu próprio:

# # 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-me de que eu não perdi nenhuma biblioteca compartilhada.

Finalmente, eu copiei os binários ldd e ldconfig (que também faziam parte do GLIBC), e chrooted dentro do meu / wheezy.

Funcionou.

Eu só posso supor que a compilação de GLIBC de uma emulação chroot-ed 'qemu-arm' dentro de um x86, de alguma forma atrapalhou as coisas - talvez o processo configure detecte algumas coisas do ambiente em execução - enquanto o cross- compilação não pode ser enganada.

Então, naturalmente, mudei para o próximo passo, e usei um shell busybox-static para substituir as pastas {/ bin, / sbin, ...} do meu antigo lenny pelas do tipo wheezy - e reiniciei no meu novo Wheezy: -)

Por meio deste argumento, meu WD MyBook World Edition é o único no planeta que executa o Debian Wheezy :-) qualquer outra pessoa está interessada, eu posso fazer upload de um tarball dos arquivos libc em algum lugar.

    
por 25.10.2014 / 17:05