Executáveis ​​x Objetos Compartilhados

13

Notei algo enquanto fazia find /bin -exec file {} \;:

o filecomando relata algumas entradas em /binsão shared objects, enquanto outras como executables. Por exemplo,

/ bin / ntfsck: objeto compartilhado
ELF de 64 bits LSB , x86-64, versão 1 (SYSV), vinculado dinamicamente (usa bibliotecas compartilhadas), para GNU / Linux 2.6.24, BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00, despojado

Mesmo relatório para gawk

/ usr / bin / gawk: objeto compartilhado
ELF de 64 bits LSB , x86-64, versão 1 (SYSV), vinculado dinamicamente (usa bibliotecas compartilhadas), para GNU / Linux 2.6.24, BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9, despojado

Em contraste filepara /bin/echoé:

/ bin / echo: Executável
ELF de 64 bits LSB , x86-64, versão 1 (SYSV), vinculado dinamicamente (usa libs compartilhadas), para GNU / Linux 2.6.24, BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c, despojado

Essencialmente, quero saber qual é a diferença entre executablearquivos e shared objectarquivos.

Sergiy Kolodyazhnyy
fonte

Respostas:

14

Tl; dr

Não há diferença, além do fato de que um executável compilado pode estar vinculado a um objeto compartilhado, mas não a um executável.


Em geral, existem duas maneiras de compilar 1 um executável:

  • Usando vinculação estática: as bibliotecas externas incluídas no código-fonte são compiladas e a biblioteca compilada (ou objeto na perspectiva do vinculador) é adicionada ao próprio executável;
  • Usando vínculo dinâmico: as bibliotecas externas incluídas no código-fonte são compiladas, mas um link para a biblioteca compilada (ou objeto na perspectiva do vinculador) é adicionado ao executável (e as bibliotecas / objetos compilados são carregados pelo vinculador em tempo de execução se necessário);

Existem vantagens / desvantagens no uso de cada um desses métodos, mas esse não é o ponto da questão;

  • /bin/ntfscke /usr/bin/gawksão objetos compartilhados: isso significa que um executável pode ser compilado e depois vinculado a ele para usar suas funcionalidades;
  • /bin/echoé um executável: isso significa que um executável pode não ser compilado e depois vinculado a ele para usar suas funcionalidades;

Então, /bin/ntfscke /usr/bin/gawkas bibliotecas estão tecnicamente compilados (ou objetos em perspectiva do ligador), mas, como se pode ter forsaw, previne nada um objeto compartilhado de ser executado como um executável.

Em uma nota lateral, observe também que os filerelatórios (para cada um deles):

vinculado dinamicamente (usa bibliotecas compartilhadas)

Isso significa que cada um deles está vinculado dinamicamente a (e provavelmente usa) outros objetos compartilhados.


1. "Compilar" pretendido em sua aceitação mais ampla, que inclui pré-processamento, compilação e vinculação.

kos
fonte
1
dinamicamente vinculado a outros objetos compartilhados , NO OS? ou bibliotecas compartilhadas em si ?!
Dr.jacky
@ Mr.Hyde No SO, mais especificamente em locais que devem ser pré-configurados no vinculador, para que o vinculador possa carregá-los em tempo de execução, se necessário. Veja aqui , capítulo 3.2.
kos
É possível vincular um executável usando o dlopen: exemplo
Adam Zahran
6

Outra diferença é que os executáveis têm um deslocamento definido do endereço do ponto de entrada, ou seja, 0x08048000 para i386, 0x00400000 para x86 e 0x00010000 para arm.

Um arquivo de objeto compartilhado pode ser uma biblioteca, mas também um executável. Ao ser um executável, não existe esse deslocamento. Um executável de objeto compartilhado , por assim dizer, é um executável independente de posição (PIE) usando a randomização de layout de espaço de endereço (ASLR). Portanto, ao examinar seu arquivo / proc / pid / maps, você notará que o local dos segmentos carregados varia em cada execução em contraste com os executáveis ​​padrão.

A idéia por trás desse recurso é adicionar segurança aos executáveis, impedindo que os invasores realizem ataques de programação orientada a retornos. Muitos mantenedores decidiram construir pacotes com o PIE ativado como padrão, por exemplo, desde o Fedora 23 ou com o Ubuntu 17.10.

florian
fonte
Resposta interessante. Faltam algumas fontes (seria bom se você adicionasse alguns links, especialmente para a parte do ponto de entrada), mas procurei algumas perguntas sobre o stackoverflow. Mas definitivamente boa resposta.
Sergiy Kolodyazhnyy 28/09