Co to jest format pliku O?
Plik .o to skompilowany plik obiektowy - pośredni plik binarny tworzony przez kompilator, taki jak GCC lub Clang, podczas tłumaczenia pojedynczego pliku źródłowego C na kod maszynowy. Wynik zawiera instrukcje maszynowe, zainicjowane i niezainicjowane segmenty danych, tablicę symboli oraz wpisy relokacji, ale nie jest jeszcze plikiem wykonywalnym: odwołania do funkcji i zmiennych zdefiniowanych w innych jednostkach translacji pozostają nierozstrzygniętymi symbolami zastępczymi dla linkera.
Format binarny zależy od platformy docelowej:
- W systemie Linux i większości systemów Unix/BSD pliki
.oużywają kontenera ELF (Executable and Linkable Format), rozpoznawanego po magicznych bajtach\x7FELFna offsecie 0 oraz polue_typeo wartościET_REL(relokowalny, wartość0x0001). - W systemie macOS odpowiednik używa formatu Mach-O, zaczynającego się od
CF FA ED FE(64-bit little-endian). - W systemie Windows funkcjonalnie identyczny plik posiada rozszerzenie .obj i korzysta z formatu COFF.
Po kompilacji linker (ld) łączy jeden lub więcej plików .o z bibliotekami, aby utworzyć plik wykonywalny lub bibliotekę współdzieloną. Wiele plików .o można również połączyć w archiwum statyczne za pomocą polecenia ar.
Pliki .o są tymczasowymi artefaktami budowania generowanymi automatycznie przez łańcuch narzędzi i nie są przeznaczone do otwierania przez użytkowników końcowych. Programiści, którzy muszą je sprawdzić, mogą użyć narzędzi nm, objdump lub readelf do zbadania symboli, sekcji i deasemblacji.
Bezpieczeństwo
RYZYKO: LOWPlik .o to dane z czasu budowania, a nie coś, co system operacyjny uruchamia, więc stanowi niewielkie bezpośrednie ryzyko dla użytkowników końcowych - nie można go kliknąć dwukrotnie i uruchomić. Dla programistów kwestią jest zaufanie do łańcucha dostaw: linkowanie obiektu z niezaufanego źródła „wszywa” jego kod maszynowy bezpośrednio do programu, więc należy budować tylko z obiektów/bibliotek z zaufanych źródeł. Obiekty we własnym drzewie budowania są bezpieczne do usunięcia; zostaną wygenerowane ponownie przy następnej kompilacji.
Szczegóły formatu
w pigułceProgramy otwierające pliki O
Szczegóły techniczne
specyfikacja| Format kontenera | ELF w Linux/Unix, Mach-O w macOS, COFF w Windows (gdzie plik zazwyczaj ma rozszerzenie `.obj`) |
| Kodowanie pliku | Binarne (nieczytelne dla człowieka tekstowo) |
| Magiczne bajty ELF | `7F 45 4C 46` (`\x7FELF`) na offsecie 0 - obecne we wszystkich plikach obiektowych opartych na ELF |
| Pole typu obiektu ELF | `e_type = ET_REL` (0x0001) w nagłówku ELF - odróżnia obiekt relokowalny od pliku wykonywalnego (`ET_EXEC`) lub biblioteki współdzielonej (`ET_DYN`) |
| Typ MIME | `application/x-object`; również przesyłany jako `application/octet-stream` przez serwery ogólnego przeznaczenia |
| Kolejność bajtów | Zakodowana w bajcie `EI_DATA` nagłówka ELF: little-endian (`ELFDATA2LSB`) na x86/x86-64/ARM, big-endian (`ELFDATA2MSB`) na PowerPC/SPARC |
| Kluczowe sekcje | `.text` (kod wykonywalny), `.data` (zainicjowane zmienne globalne), `.bss` (zmienne globalne inicjowane zerami), `.rodata` (stałe tylko do odczytu) |
| Tablica symboli | Sekcja `.symtab` listuje nazwę każdego zdefiniowanego i przywoływanego symbolu, jego powiązanie (lokalne/globalne/słabe), typ (funkcja/obiekt) oraz wartość |
| Wpisy relokacji | Sekcje `.rel.text` / `.rela.text` rejestrują każde miejsce adresowe, które linker musi „załatać” podczas łączenia plików obiektowych w końcowy plik binarny |
| Identyfikacja architektury | Pole `e_machine` w nagłówku ELF identyfikuje docelowy procesor: `EM_X86_64` (0x3E), `EM_AARCH64` (0xB7), `EM_386` (0x03) itd. |
| Typowy rozmiar pliku | Od 1 KB do kilku MB na jednostkę translacji, zależnie od złożoności źródła i poziomu optymalizacji kompilatora |
| Kompresja | Brak - pliki obiektowe są przechowywane jako surowe, nieskompresowane dane binarne |
| Model kompilacji jeden-do-jednego | Dokładnie jeden plik `.o` jest generowany na każdą jednostkę translacji źródła (jeden na plik `.c` lub `.cpp`); linker łączy je później |
| Pakowanie bibliotek statycznych | Wiele plików `.o` jest archiwizowanych w bibliotece statycznej `.a` za pomocą `ar`, co zachowuje każdy obiekt jako nazwany element składowy |
| Rozstrzyganie tylko w czasie linkowania | W przeciwieństwie do bibliotek współdzielonych `.so` / `.dylib`, wszystkie odwołania do symboli w `.o` są rozstrzygane całkowicie w czasie linkowania, nie pozostawiając dynamicznych zależności w czasie wykonywania |
| Narzędzia inspekcji | `nm` (lista symboli), `objdump` (deasemblacja i zrzuty sekcji), `readelf` (nagłówek ELF i szczegóły sekcji), `otool` (odpowiednik dla macOS Mach-O) |
| Wydano | Object-file concept from early Unix (1970s); ELF since System V Release 4 (early 1990s) |
| Najnowsza wersja | ELF format frozen since the 1990s; container evolves with each compiler/ABI |
| Otwarty standard | Tak · bezpłatny (royalty-free) |
| Specyfikacja | refspecs.linuxfoundation.org |
Konwersje O
Pytania i odpowiedzi społeczności
pytania użytkownikówBrak pytań - bądź pierwszą osobą, która zapyta o pliki O.