Pliki wykonywalne a obiekty współdzielone

13

Zauważyłem coś podczas robienia find /bin -exec file {} \;:

filekomenda informuje niektóre wpisy w /binto 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 filedo tego /bin/echojest:

/ 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 executableplikami a shared objectplikami.

Sergiy Kolodyazhnyy
źródło

Odpowiedzi:

14

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 linkowania statycznego: zewnętrzne biblioteki zawarte w kodzie źródłowym są kompilowane, a skompilowana biblioteka (lub obiekt w perspektywie linkera) jest dodawana do samego pliku wykonywalnego;
  • Korzystanie z dynamicznego linkowania: zewnętrzne biblioteki zawarte w kodzie źródłowym są kompilowane, ale łącze do skompilowanej biblioteki (lub obiektu w perspektywie linkera) jest dodawane do pliku wykonywalnego (a skompilowane biblioteki / obiekty są ładowane przez linker w czasie wykonywania, jeśli potrzebne);

Korzystanie z każdej z tych metod ma zalety / wady, ale nie o to chodzi;

  • /bin/ntfscki /usr/bin/gawksą 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/echojest 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/ntfscki /usr/bin/gawksą 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 fileraporty (dla każdego z nich):

dynamicznie linkowany (wykorzystuje współdzielone biblioteki lib)

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.

kos
źródło
1
dynamicznie powiązany z innymi obiektami współdzielonymi , IN OS? czy same biblioteki współdzielone ?!
Dr.jacky,
@ Mr.Hyde W systemie operacyjnym, a dokładniej w lokalizacjach, które muszą zostać wstępnie skonfigurowane w konsolidatorze, aby w razie potrzeby linker mógł je załadować w czasie wykonywania. Zobacz tutaj rozdział 3.2.
Kos,
Można faktycznie połączyć się z plikiem wykonywalnym za pomocą dlopen: D przykład
Adam Zahran
6

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.

florian
źródło
Ciekawa odpowiedź. Brakuje kilku źródeł (byłoby miło, gdybyś dodał kilka linków, szczególnie dla części punktu wejścia), ale szukałem kilku pytań na ten temat na temat przepełnienia stosu. Ale zdecydowanie dobra odpowiedź.
Sergiy Kolodyazhnyy