Executáveis versus objetos compartilhados

11

Eu notei algo ao fazer find /bin -exec file {} \; :

o comando file reporta algumas entradas em /bin são shared objects , enquanto outras como executables . Por exemplo,

  

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

Mesmo relatório para gawk

  

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

Em contraste, file para /bin/echo é:

  

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

Essencialmente, quero saber qual é a diferença entre os arquivos executable e os arquivos shared object .

    
por Sergiy Kolodyazhnyy 27.10.2015 / 15:47

2 respostas

13

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 a vinculação estática: 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 vinculação dinâmica: bibliotecas externas incluídas no código-fonte são compiladas, mas um link para a biblioteca compilada (ou objeto na perspectiva do vinculador) é adicionada ao executável (e às 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/ntfsck e /usr/bin/gawk são objetos compartilhados: isso significa que um executável pode ser compilado e vinculado a eles para usar suas funcionalidades;
  • /bin/echo é um executável: isso significa que um executável pode ser não compilado e então vinculado a ele para usar suas funcionalidades;

Portanto, /bin/ntfsck e /usr/bin/gawk são bibliotecas tecnicamente compiladas (ou objetos na perspectiva do vinculador), mas, como se pode ter visto, nada impede que um objeto compartilhado seja executado como um executável.

Em uma nota secundária, observe também que file relatórios (para cada um deles):

  

dinamicamente vinculado (usa bibliotecas compartilhadas)

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

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

    
por kos 27.10.2015 / 16:13
2

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

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 posicional (PIE) usando randomização de layout de espaço de endereço (ASLR). Assim, ao olhar para o arquivo / proc / pid / maps, você notará que a localização dos segmentos carregados varia em cada execução, em contraste com os executáveis padrão.

A idéia por trás deste recurso é adicionar segurança aos executáveis impedindo que os atacantes executem ataques de programação orientados a retorno. Muitos mantenedores decidiram construir pacotes com o PIE habilitado como padrão, por exemplo, desde o Fedora 23 ou com o Ubuntu 17.10.

    
por florian 28.09.2017 / 14:08