Ubuntu Toque no Nexus 7: Por que não ld-linux.so *?

3

Versão resumida:

Instalado o Ubuntu Touch, e notou que não há /lib/ld-linux.so.3 vinculador dinâmico (link simbólico ou outro). Primeira vez que vi isso faltando em uma instalação do Linux. Existe algum motivo particular para isso não estar lá?

Versão longa:

Acabei de instalar o Ubuntu Touch (13.10, estável) em um Nexus 7 de primeira geração e quero testar uma compilação voltada para o ARM nele.

Instalei o pacote gcc-arm-linux-gnueabi no meu desktop Ubuntu (12.04, incidentalmente) e compilei um simples "hello world" em C, copiei-o para o Nexus, ssh 'd in e executei o executável ( %código%). A resposta foi:

-bash: ./nexustest: No such file or directory

Por fim, descobri que isso acontecia porque o Ubuntu não estava conseguindo carregar o nexustest vinculador dinâmico. Como de costume em um executável Linux não-estaticamente vinculado, ld-linux.so mostra que está procurando por ldd nexustest , e a instalação do Ubuntu Touch não tem isso.

Eu posso "consertar" isso com qualquer um dos seguintes, caso em que o "hello world" é executado como esperado:

  • Copiando ou criando links simbólicos /lib/ld-linux.so.3 para /lib/ld-linux-armhf.so.3 - sugerindo que /lib/ld-linux.so.3 é o vinculador dinâmico correto

  • Compilando (vinculando) o executável com ld-linux-armhf.so.3 - sugerindo que -static esteja usando o vinculador / arco correto

Da perspectiva de vinculação do GCC e do Linux, tudo parece estar funcionando como esperado, exceto pelo fato de que não há arm-linux-gnueabi-gcc no meu Nexus 7 (o que espero seria um link simbólico para /lib/ld-linux.so.3 ). Por que é que? A omissão é um erro ou alguma decisão intencional de distro-design que eu não estou entendendo?

    
por user206468 23.10.2013 / 07:35

1 resposta

2

As versões do Ubuntu Touch usam o armhf ABI, uma arquitetura que fornece melhorias significativas de desempenho em chips ARM mais novos. O compilador cruzado que tem como alvo esta ABI é o pacote gcc-arm-linux-gnueabihf (hf para "hard float"), em vez do gcc-arm-linux-gnueabi pacote. Este armhf cross-compiler está disponível em 12.04.

Você não deve criar links simbólicos para /lib/ld-linux-armhf.so.3 para /lib/ld-linux.so.3. Os vinculadores têm nomes diferentes precisamente porque são usados para bibliotecas que possuem convenções de chamada diferentes. Um "hello world" pode funcionar bem, mas os programas começarão a falhar de maneira misteriosa assim que você usar qualquer código que precise passar números de ponto flutuante como argumentos para uma função.

    
por slangasek 23.10.2013 / 07:54