Em arquivos executáveis no Linux [closed]

0

disse que no linux, ao contrário do Windows , não há uma borda clara entre executáveis e outros arquivos.

Bem, no Windows, escrevo um programa em C ++, então ele é pré-compilado, compilado e, em seguida, vinculado para se tornar um arquivo distinto: executável. As mudanças são tantas que não são reversíveis.

Mas no Linux um arquivo de texto simples contendo um código é executado. Então, o que compilação e ligação fazem? Se um código é executado, por que ele é compilado? O que é bom nesse processo e qual é a principal diferença entre o código e o arquivo executável final (assim chamado) no Linux? Por que a portabilidade de programas é limitada no Linux e precisa de muitos requisitos de dependência (específicos da versão), se eles são códigos?

    
por Community 04.01.2014 / 01:21

5 respostas

4

tl; dr: a diferença é o bit executável.

A resposta está no modelo de permissões do UNIX. Para ser sincero, esqueço o modelo de permissões do Windows, mas no UNIX (e, portanto, no GNU / Linux), há três principais bits de permissão que podem ser definidos em um arquivo: ler, gravar e executar. Esses bits podem ser definidos em qualquer coisa . Existem dois tipos principais de arquivos nos quais você deseja definir o bit executável:

  1. Binários
  2. Scripts

O primeiro tipo funciona exatamente como .exe s no Windows. A única diferença é que a capacidade do arquivo a ser executado é determinada por um bit de permissão no sistema de arquivos, em vez da extensão do arquivo. Os binários ainda têm um formato, assim como .exe s. No GNU / Linux, esse formato é chamado de ELF . O kernel do Linux possui uma lógica especial que informa como ler o formato dos binários ELF. Quando você executa um binário, é essa lógica que realmente executa o código.

A parte que está confundindo você é o segundo tipo de executável: scripts. Scripts são arquivos de texto regulares que podem ser executados por um intérprete, como python ou bash . Os scripts começam com algo chamado shebang , que se parece com isto: #! . Quando um script é "executado", o kernel reconhece o shebang e executa qualquer binário especificado após ele, com o caminho do script que você está executando como argumento.

Por exemplo, digamos que eu tenha um script com o bit de executável definido, no caminho /home/alex/bin/test_script . Este script tem o seguinte como a primeira linha:

#!/bin/bash

Quando você executa este script, o kernel reconhecerá o shebang no começo. Em seguida, ele carregará /bin/bash e passará /home/alex/bin/test_script como o primeiro argumento. Isso seria equivalente a executar o seguinte na linha de comando:

/bin/bash /home/alex/bin/test_script

Dessa forma, bash é carregado para interpretar ou "executar" o script.

Como um pequeno aparte, a mudança de fonte para binário não é tão grande que não possa ser revertida. A recuperação do código-fonte de um binário é chamada decompiling .

    
por 04.01.2014 / 01:40
3

But in linux a simple text file containing a code is executed. So what do compilation and linkage do?

Isso ocorre porque o Linux não depende de extensões, mas do bit executável. Normalmente, quando os compiladores concluem seu trabalho, eles adicionam o bit executável ao binário compilado. É por isso que normalmente você pode executar o código C ++ que acabou de compilar. No caso de arquivos de texto é diferente. Eles usam o caminho de interpreter file sendo interpreter um executável já; ou ./file se o arquivo tiver um shebang ( #! ) que informe ao sistema qual intérprete usar.

What's good in this process and what is the main difference between the code and the final (so called) executable file in linux?

Acho que isso já foi respondido, mas a fonte do código não está de modo algum pronta para ser executável. Ele deve ser compilado, as bibliotecas ligadas, etc. O sistema não deve fazer isso em tempo de execução (compilação), portanto, primeiro ele deve ser compilado e executado.

Why portability of programs is limited in linux and needs a lot of (version specific) dependency requirements, if they are codes?

Isso depende do sistema operacional e das bibliotecas instaladas. Isso é realmente uma coisa boa! Isso significa que você não tem a mesma biblioteca sempre que instala algo. No Windows, você pode facilmente terminar com 3 ou 4 versões do GTK + instaladas em diferentes caminhos. No Linux você instala uma vez e cada aplicativo é capaz de executá-lo e os benefícios de todas as atualizações dadas. Se você quiser removê-los, não precisa caçar cada uma das bibliotecas.

BTW, eles não são códigos. Eles já são bibliotecas compiladas (a maioria deles) e podem ser chamados à vontade pelos programas que precisam deles em locais fixos. Alguns usam o linker GNU para tornar isso ainda mais fácil.

    
por 04.01.2014 / 01:49
2

Os executáveis no Linux funcionam da mesma maneira que no Windows.

Dado o código-fonte de C++ , você o compila em um binário, tanto no Linux quanto no Windows.

Outros idiomas como perl não são compilados. Eles precisam de algum intérprete para serem executados. Isso é o mesmo no Linux e no Windows.

No Windows, você tem scripts em lote. Eles são praticamente os mesmos que scripts de shell no Linux: Eles são apenas texto que é executado linha por linha.

Portanto, a diferença não é entre o Linux e o Windows, mas a diferença entre linguagens compiladas e linguagens de script.

    
por 04.01.2014 / 01:35
1

Cada executável unix precisa de duas coisas: modo apropriado e assinatura. Mode é definido por chmod e define que o sistema pode tentar executar o arquivo. Assinatura - dois primeiros bytes - é uma dica para o sistema sobre como o executável pode ser executado.

Os scripts geralmente começam com "shebang" - #! - sinal especial de que algum interpretador deve ser iniciado. Primeira linha #!/bin/sh significa que o sistema deve iniciar outro executável /bin/sh e passar seu script para ele como argumento. Então scripts são executados indiretamente.

Os executáveis "reais" começam com "? E", o que significa que o sistema pode carregar esse arquivo diretamente na memória.

    
por 04.01.2014 / 01:41
1

Bem, vamos ver. Primeiro de tudo, certamente não é verdade que qualquer arquivo que contenha código possa ser executado em * nix. Basicamente, executáveis são a mesma coisa para todos os sistemas operacionais. A única diferença real (e com o que o post vinculado está realmente dizendo) é que, no Windows, as extensões de arquivo são usadas pelo sistema para determinar qual é o tipo de arquivo de um determinado arquivo, enquanto no * nix isto é geralmente irrelevante. Você pode usar extensões arbitrárias e não afetar o arquivo de forma alguma.

Agora vou dar uma simplificação horrível. Existem basicamente dois tipos principais de linguagens de programação, linguagens compiladas e linguagens de script. Para escrever um programa em uma linguagem compilada (como C ou C ++ ou Fortran), você primeiro escreve um arquivo de texto contendo seu código e então compila esse arquivo de texto em um binário. Essa compilação essencialmente transforma coisas como for(i=0;i<10;i++){do stuff} em algo que um computador pode entender.

Linguagens de script (como Perl ou Python ou bash), por outro lado, funcionam através de um interpretador. Este interpretador lê o código fonte e o traduz em comandos de máquina na hora (kinda). Não há necessidade de compilar porque o intérprete se encarrega de traduzir os comandos que você escreveu em coisas que seu computador pode entender.

Assim, programas escritos em linguagens compiladas são executados como arquivos binários, enquanto aqueles escritos em linguagens de script são interpretados pelo interpretador, mas tanto o binário quanto o script são arquivos executáveis. Isso é exatamente o mesmo no Windows e no * nix.

    
por 04.01.2014 / 01:36