Zauważyłem coś podczas robienia find /bin -exec file {} \;
:
file
komenda informuje niektóre wpisy w /bin
to shared objects
, a inni jak executables
. Na przykład,
/ bin / ntfsck:
ELF 64-bitowy obiekt współdzielony LSB , x86-64, wersja 1 (SYSV),
dynamicznie połączony (wykorzystuje współdzielone biblioteki lib), dla GNU / Linux 2.6.24, BuildID [sha1] = 312d93fd0d8653e7236a61db2e67b93c63225a00, rozebrany
Ten sam raport dla gawk
/ usr / bin / gawk:
ELF 64-bitowy obiekt współdzielony LSB , x86-64, wersja 1 (SYSV),
dynamicznie połączony (wykorzystuje współdzielone biblioteki
lib ), dla GNU / Linux 2.6.24, BuildID [sha1] = 76bb13aac7e212164bd6e0d7b8a5d92db44543c9, rozebrany
W przeciwieństwie file
do tego /bin/echo
jest:
/ bin / echo:
ELF 64-bitowy plik wykonywalny LSB , x86-64, wersja 1 (SYSV),
dynamicznie połączony (wykorzystuje współdzielone biblioteki
lib ), dla GNU / Linux 2.6.24, BuildID [sha1] = 193e75fc13e9c4599e772b8d79125a5934cf601c, z paskiem
Zasadniczo chcę wiedzieć, jaka jest różnica między executable
plikami a shared object
plikami.
źródło
Odpowiedzi:
Tl; dr
Nie ma różnicy, poza tym, że skompilowany plik wykonywalny może być powiązany z obiektem współdzielonym, ale nie z plikiem wykonywalnym.
Ogólnie istnieją dwa sposoby na skompilowanie 1 pliku wykonywalnego:
Korzystanie z każdej z tych metod ma zalety / wady, ale nie o to chodzi;
/bin/ntfsck
i/usr/bin/gawk
są obiektami współdzielonymi: oznacza to, że plik wykonywalny może zostać skompilowany, a następnie powiązany z nimi w celu wykorzystania ich funkcjonalności;/bin/echo
jest plikiem wykonywalnym: oznacza to, że plik wykonywalny może nie zostać skompilowany, a następnie połączony z nim w celu użycia jego funkcjonalności;Tak
/bin/ntfsck
i/usr/bin/gawk
są technicznie skompilowane biblioteki (lub obiektów w perspektywie linkera), ale, jak można mieć forsaw nic nie stoi obiektu udostępnionego przed uruchamiane jako plik wykonywalny.Na marginesie zauważ, że
file
raporty (dla każdego z nich):Oznacza to, że każdy z nich jest dynamicznie powiązany (i prawdopodobnie używa) również z innymi obiektami współdzielonymi.
1. „Kompilacja” ma na celu szerszą akceptację, która obejmuje przetwarzanie wstępne, kompilację i łączenie.
źródło
Inna różnica polega na tym, że pliki wykonywalne mają zdefiniowane przesunięcie adresu punktu wejścia, tj. 0x08048000 dla i386, 0x00400000 dla x86 i 0x00010000 dla uzbrojenia.
Plik współdzielonego obiektu może być biblioteką, ale także plikiem wykonywalnym. Gdy jest wykonywalny, nie ma takiego przesunięcia. Plik wykonywalny obiektu współdzielonego , że tak powiem, to niezależny od pozycji plik wykonywalny (PIE) wykorzystujący randomizację układu przestrzeni adresowej (ASLR). Tak więc, patrząc na jego plik / proc / pid / maps, zauważysz, że lokalizacja załadowanych segmentów różni się w każdym wykonaniu w przeciwieństwie do standardowych plików wykonywalnych.
Ideą tej funkcji jest zwiększenie bezpieczeństwa plików wykonywalnych, utrudniając atakującym wykonywanie ataków programistycznych zorientowanych na zwrot. Wielu opiekunów zdecydowało się budować pakiety z włączoną PIE jako domyślną, np. Od Fedory 23 lub z Ubuntu 17.10.
źródło