erro ao carregar bibliotecas compartilhadas: libc.so.6: não é possível abrir o arquivo de objeto compartilhado

2

Eu tenho um kernel Linux e faço chroot em /var/chroot :

Eu adicionei bash dependencies assim:

ldd /bin/bash
        linux-vdso.so.1 =>  (0x00007fff9a373000)
        libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f24d57af000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f24d55ab000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f24d51eb000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f24d59f8000)

Então eu fiz:

# cd /var/chroot/
# mkdir bin/ lib64/ lib/
# cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/
# cp /lib/x86_64-linux-gnu/libdl.so.2 lib/
# cp /lib/x86_64-linux-gnu/libc.so.6 lib/
# cp /lib64/ld-linux-x86-64.so.2 lib64/
# cp /bin/bash bin/

depois disso:

# chroot /var/chroot

Depois disso, copiei /bin/ls e as bibliotecas mostradas por ldd ls . Mas quando executo ls , tenho o seguinte erro:

ls: error while loading shared libraries: libpthread.so.0: wrong ELF class: ELFCLASS32
    
por MLSC 15.01.2015 / 11:43

3 respostas

2

Como você aparentemente conseguiu lançar o bash, você tem o básico certo: você precisa copiar todas as bibliotecas listadas por ldd /bin/command para um diretório no caminho de carregamento da biblioteca , mais o próprio carregador ( /lib64/ld-linux-x86-64.so.2 ) que precisa estar no local codificado nos executáveis.

Se você receber o erro

error while loading shared libraries: libc.so.6: cannot open shared object file

então você está perdendo a biblioteca indicada aqui. Verifique se você colocou no diretório correto com o nome correto. Verifique se você copiou o arquivo da biblioteca e não apenas um link simbólico para ele.

Se você receber o erro

ls: error while loading shared libraries: libpthread.so.0: wrong ELF class: ELFCLASS32

você copiou uma biblioteca para a arquitetura errada - você deve ter copiado um libpthread.so.0 de 32 bits, mas está executando uma biblioteca de 64 bits.

Se você tiver mais problemas, talvez seja útil descobrir exatamente onde o carregador tenta encontrar as bibliotecas. Coloque um binário strace no chroot (um compilado estaticamente, ou um compilado dinamicamente todas as bibliotecas necessárias) e execute chroot ls e veja exatamente o que está falhando. Ou execute strace chroot ls para usar o binário strace que está fora do chroot.

    
por 16.01.2015 / 01:07
1

Cuidado. Os arquivos da biblioteca compartilhada são geralmente ligados por links simbólicos. Dessa forma, a versão atual pode ser alterada e todos os aplicativos instalados ainda podem encontrá-la. Por exemplo, no meu sistema:

ls -l /usr/lib/libc.so.6
lrwxrwxrwx 1 root root 12 dec 27 03:13 /usr/lib/libc.so.6 -> libc-2.20.so*

Portanto, libc.so.6 aponta para a versão atual da libc e, quando eu atualizar o sistema, ele apontará para a nova versão, seja ela qual for. Existem freqüentes múltiplos níveis de vinculação.

Você precisa copiar as bibliotecas reais, não apenas os links.

    
por 15.01.2015 / 11:51
1

tente

mkdir lib/x86_64-linux-gnu
cp /lib/x86_64-linux-gnu/libtinfo.so.5  /lib/x86_64-linux-gnu/libdl.so.2 /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu

Se você desejar usar comandos como o ls, também precisará ldd /bin/ls e copiar o arquivo da biblioteca.

a propósito, cp copiará o conteúdo de um link simbólico.

    
por 15.01.2015 / 11:58