Por que o Ubuntu 12.04 64bit reconhece um symlink como um arquivo binário?

0

Eu tenho dois arquivos. Um arquivo tem o nome gcc e é um arquivo shell. Outro arquivo tem o nome g++ e contém dados como este:

!<symlink>ÿþg c c

Eu posso rodar o arquivo shell gcc mas o arquivo g ++ não pode rodar. Quando tento vejo este erro:

bash: ./g++: cannot execute binary file

Alguém pode explicar por que vejo esse erro?

saída de ls -l para este arquivo:

-rwxrwxrwx 1 root root 20 May 18 11:43 g++
    
por thaihoangduylinh 31.05.2016 / 03:37

1 resposta

3

Quando você executa ls -l no diretório (em seu vídeo), você pode ver que g++ não é um link simbólico. Aqui está como um link simbólico do meu sistema se parece:

lrwxrwxrwx   1 root root    10 May 28 20:20 modules.conf -> ../modules

Anote a string no começo: lrwxrwxrwx - todos os links simbólicos têm isso.

Você também pode dizer que seu arquivo g++ não é um link simbólico, porque quando você o abre, em vez de ver o conteúdo do arquivo para o qual ele aponta, você vê alguns outros dados.

Se um arquivo não for legível, por exemplo, ele não tem um cabeçalho conhecido ou um número mágico file name-of-file retornará data e os programas poderão decidir que é um 'arquivo binário'. Digite man file para saber mais sobre isso.

Para solucionar essa parte do seu problema, basta substituir os arquivos criando links simbólicos para substituir os arquivos quebrados, por exemplo:

Para criar um link simbólico para o arquivo gcc chamado g++ no diretório, faça o seguinte:

ln -s gcc g++

E, em seguida, ls -l para verificar. Você deveria ver algo como:

lrwxrwxrwx  1 zanna zanna    3 May 31 08:38 g++ -> gcc
-rwxrwxr-x  1 zanna zanna    0 May 31 08:38 gcc

Mas se o seu script envsetup será executado, então ... outra pergunta.

Como isso aconteceu?

Além do escopo da questão, na verdade, mas para investigação adicional:

Você mencionou que sua tentativa de criar o ambiente gera stray 6 and 7 . Esta é a notação octal de 5 e 4 , que é uma Marca de pedido de byte , mostrando que um arquivo usa UTF-16 codificação. A codificação UTF-16 (little endian) também é representada pelos caracteres ÿþ que você vê no seu não-symlink. Esses bits de código serão informados como "dispersos" se ocorrerem em qualquer lugar diferente do início de um arquivo. O Windows (NTFS) e outros sistemas de arquivos usam a codificação UTF-16 LE para nomes de arquivos (e as cadeias de caracteres Unicode que armazenam sua versão de links simbólicos), então isso pode estar acontecendo porque partes dos nomes de caminho estão em tal sistema de arquivos. Novamente, corrija fazendo novos links simbólicos.

Você não pode transformar um usuário comum arquivo em um link simbólico porque em geral o symlink-ness é um metadado armazenado no sistema de arquivos, em tabelas de inode.

No entanto, como existem implementações de links simbólicos que armazenam os dados do caminho dentro do arquivo, e esse método pode ser usado como um fallback no caso de não haver inodes suficientes disponíveis para armazenar caminhos de symlink, isso pode ter acontecido porque você não tem inodes suficientes na partição (dê uma olhada com df -i . )

    
por Zanna 31.05.2016 / 09:39