Notei algo enquanto fazia find /bin -exec file {} \;
:
o file
comando relata algumas entradas em /bin
sã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 file
para /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 executable
arquivos e shared object
arquivos.
fonte
Respostas:
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:
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 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/ntfsck
e/usr/bin/gawk
as 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
file
relatórios (para cada um deles):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.
fonte
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.
fonte