Кіріспе

Орындалатын файлдар, объектілік код, ортақ кітапханалар және жүйелік жад төгілмелері үшін стандартты файл форматы. ELF форматы бастапқы жоспары бойынша икемді, кеңейтілмелі және платформадан тәуелсіз. Мысалы, ол әртүрлі енділіктерді (endianness) және адрестің мөлшерін қолдайды, сондықтан ол нақты бір процессорды немесе командалар жинағының архитектурасын шектемейді. Осының арқасында ол көптеген түрлі аппараттық платформалардағы көптеген түрлі операциялық жүйелерде қолданысқа енді.

Файлдың бастығы

ELF тақырыбы 32 биттік немесе 64 биттік мекенжайларды пайдалану керектігін анықтайды. Тақырыпта осы параметрге әсер ететін және одан кейін келетін басқа өрістерді ығыстыратын үш өріс бар. ELF тақырыбы 32 биттік және 64 биттік екілік файлдар үшін тиісінше 52 немесе 64 байтты құрайды. + ELF header Offset Мөлшері (байт) Өрістің мақсаты 32 бит 64 бит 32 бит 64 бит 0x00 4 - 0x7F аралығында, содан кейін ASCII кодировкасында ELF; бұл төрт байттан тұратын «магиялық сан». 0x04 1 Бұл байт 32 немесе 64 биттік форматты көрсету үшін 1 немесе 2 мәніне орнатылады. 0x05 1 Бұл байт 1 немесе 2 мәніне орнатылады, бұл тиісінше кішкентай немесе үлкен енділікті білдіреді. Бұл 0x10 ығысынан басталатын көп байттық өрістерді интерпретациялауға әсер етеді. 0x06 1 ELF-тің бастапқы және қазіргі нұсқасы үшін 1-ге орнатылады. 0x07 1 Мақсатты операциялық жүйенің ABI-ін анықтайды. МәніABI0x00System V0x01HP UX0x02NetBSD0x03Linux0x04GNU Hurd0x06Solaris0x07AIX (Monterey)0x08IRIX0x09FreeBSD0x0ATru640x0BNovell Modesto0x0COpenBSD0x0DOpenVMS0x0ENonStop Kernel0x0FAROS0x10FenixOS0x11Nuxi CloudABI0x12Stratus Technologies OpenVOS 0x08 1 Бұдан әрі ABI нұсқасын нақтылайды. Оның интерпретациясы мақсатты ABI-ге байланысты. Linux ядросы (кем дегенде 2.6 нұсқасынан бастап) оны анықтамайды, сондықтан ол статикалық байланыстырылған орындалатын файлдар үшін ескерілмейді. Бұл жағдайда EI PAD-тің ығысы мен мөлшері 8-ге тең. glibc 2.12+ нұсқасы бұл өрісті динамикалық байланыстырушының ABI нұсқасы ретінде қарастырады: ол динамикалық байланыстырушының мүмкіндіктерінің тізімін анықтайды, ортақ объект (орындалатын файл немесе динамикалық кітапхана) сұраған мүмкіндік деңгейі ретінде қарастырады және белгісіз мүмкіндік сұралса, оны жүктеуден бас тартады, яғни мәні ең үлкен белгілі мүмкіндіктен жоғары болса. 0x09 7 Толтыру байттары. Қазіргі уақытта пайдаланылмайды. Нөлдермен толтырылуы керек және оқығанда ескерілмеуі тиіс. 0x10 2 Объект файлының түрін анықтайды. МәніТүріМағынасы0x00ET NONEБелгісіз.0x01ET RELҚайта орналастырылатын файл.0x02ET EXECОрындалатын файл.0x03ET DYNОртақ объект.0x04ET COREТүйін файл.0xFE00ET LOOSРезервтелген, кіріспелі диапазон. Операциялық жүйеге тән.0xFEFFET HIOS0xFF00ET LOPROCРезервтелген, кіріспелі диапазон. Процессорға тән.0xFFFFET HIPROC 0x12 2 Мақсатты нұсқаулар жиынтығының архитектурасын анықтайды. Мысалдар:МәніISA0x00Арнайы нұсқаулар жиынтығы жоқ0x01AT&T WE 321000x02SPARC0x03x860x04Motorola 68000 (M68k)0x05Motorola 88000 (M88k)0x06Intel MCU0x07Intel 808600x08MIPS0x09IBM System/3700x0AMIPS RS3000 Little endian0x0B 0x0ERезервтелген, болашақ қолдану үшін0x0FHewlett Packard PA RISC0x13Intel 809600x14PowerPC0x15PowerPC (64 бит)0x16S390, S390x қоса алғанда0x17IBM SPU/SPC0x18 0x23Резервтелген, болашақ қолдану үшін0x24NEC V8000x25Fujitsu FR200x26TRW RH 320x27Motorola RCE0x28Arm (Armv7/AArch32 дейін)0x29Digital Alpha0x2ASuperH0x2BSPARC Version 90x2CSiemens TriCore кіріктірілген процессоры0x2DArgonaut RISC Core0x2EHitachi H8/3000x2FHitachi H8/300H0x30Hitachi H8S0x31Hitachi H8/5000x32IA 640x33Stanford MIPS X0x34Motorola ColdFire0x35Motorola M68HC120x36Fujitsu MMA Multimedia Accelerator0x37Siemens PCP0x38Sony nCPU кіріктірілген RISC процессоры0x39Denso NDR1 микропроцессоры0x3AMotorola Star*Core процессоры0x3BToyota ME16 процессоры0x3CSTMicroelectronics ST100 процессоры0x3DAdvanced Logic Corp. TinyJ кіріктірілген процессорлар отбасы0x3EAMD x86 640x3FSony DSP Processor0x40Digital Equipment Corp. PDP 100x41Digital Equipment Corp. PDP 110x42Siemens FX66 микроконтроллері0x43STMicroelectronics ST9+ 8/16 биттік микроконтроллері0x44STMicroelectronics ST7 8 биттік микроконтроллері0x45Motorola MC68HC16 Microcontroller0x46Motorola MC68HC11 Microcontroller0x47Motorola MC68HC08 Microcontroller0x48Motorola MC68HC05 Microcontroller0x49Silicon Graphics SVx0x4ASTMicroelectronics ST19 8 биттік микроконтроллері0x4BDigital VAX0x4CAxis Communications 32 биттік кіріктірілген процессоры0x4DInfineon Technologies 32 биттік кіріктірілген процессоры0x4EElement 14 64 биттік DSP Processor0x4FLSI Logic 16 биттік DSP Processor0x8CTMS320C6000 Family0xAFMCST Elbrus e2k0xB7Arm 64 бит (Armv8/AArch64)0xDCZilog Z800xF3RISC V0xF7Berkeley Packet Filter0x101WDC 65C8160x102LoongArch 0x14 4 ELF-тің бастапқы нұсқасы үшін 1-ге орнатылады. 0x18 4 8 Бұл процесс орындала бастайтын кіру нүктесінің жад мекенжайы. Бұл өрістің ұзындығы 32 немесе 64 битті, бұрын анықталған форматқа байланысты (байт 0x04). Егер файлдың кіру нүктесі болмаса, онда бұл мән нөлге тең. 0x1C 0x20 4 8 Бағдарлама тақырыбының кестесінің басына сілтеме жасайды. Әдетте ол файл тақырыбынан кейін тікелей келеді, 32 және 64 биттік ELF орындалатын файлдары үшін 0x34 немесе 0x40 ығысын жасайды. 0x20 0x28 4 8 Бөлім тақырыбының кестесіне сілтеме жасайды. 0x24 0x30 4 Бұл өрістің интерпретациясы мақсатты архитектураға байланысты. 0x28 0x34 2 Бұл тақырыбының мөлшерін қамтиды, әдетте 64 бит үшін 64 байт және 32 бит үшін 52 байт. 0x2A 0x36 2 Бағдарлама тақырыбының кестесі жазуының мөлшерін қамтиды. Төменде түсіндірілгендей, бұл әдетте 0x20 (32 бит) немесе 0x38 (64 бит) болады. 0x2C 0x38 2 Бағдарлама тақырыбының кестесіндегі жазбалар санын қамтиды. 0x2E 0x3A 2 Бөлім тақырыбының кестесі жазуының мөлшерін қамтиды. Төменде түсіндірілгендей, бұл әдетте 0x28 (32 бит) немесе 0x40 (64 бит) болады. 0x30 0x3C 2 Бөлімдер тақырыбының кестесіндегі жазбалар санын қамтиды. 0x32 0x3E 2 Бөлім атауларын қамтитын бөлім тақырыбының кестесі жазуының индексін қамтиды.0x340x40 ELF тақырыбының соңы (мөлшері).

Бағдарламаның бастығы

Бағдарлама тақырыбының кестесі жүйеге процесс имиджін қалай құру керектігін көрсетеді. Ол файлдық офсетте (file offset) орналасқан және әрқайсысы белгілі бір өлшемдегі жазбалардан тұрады. 32 биттік ELF және 64 биттік ELF-те орналасу сәл өзгеше, себебі олар туралау мақсатымен әртүрлі құрылымдарда орналасқан. Әрбір жазба былай құрылған:

+ Бағдарлама тақырыбының офсеті Өлшемі (байт) Өріс Мақсаты 32 бит 64 бит 32 бит 64 бит 0x00 4 Сегмент түрін анықтайды. Атау-Мәні (ValueNameMeaning) 0x00000000 Бағдарлама тақырыбының кестесі кіре алмайды. 0x00000001 Жүктелетін сегмент. 0x00000002 Динамикалық байланыс ақпараты. 0x00000003 Интерпретатор ақпараты. 0x00000004 Көмекші ақпарат. 0x00000005 Ұсталған. 0x00000006 Бағдарлама тақырыбының кестесін қамтитын сегмент. 0x00000007 Желгіш тілдік сақтау үлгісі. 0x60000000 Ұсталған, кіріктірілген диапазон. Операциялық жүйеге тән. 0x6FFFFFFF 0x70000000 Кіріктірілген шекті диапазон. Процессорға тән. 0x7FFFFFFF 0x04 4 Сегментке тәуелді флагтар (64 биттік құрылым үшін орналасу). Атау-Мәні (ValueNameMeaning) 0x1 Орындалатын сегмент. 0x2 Жазылатын сегмент. 0x4 Оқылатын сегмент. 0x04 0x08 4 8 Файл имиджіндегі сегменттің офсеті. 0x08 0x10 4 8 Сегменттің жадыдағы виртуалды адресі. 0x0C 0x18 4 8 Физикалық адрестің маңызды болған жүйелерде сегменттің физикалық адресі үшін резервтелген. 0x10 0x20 4 8 Файл имиджіндегі сегменттің байттармен өлшемi. 0 болуы мүмкін. 0x14 0x28 4 8 Сегменттің жадыдағы байттармен өлшемi. 0 болуы мүмкін. 0x18 4 Сегментке тәуелді флагтар (32 биттік құрылым үшін орналасу). Жоғарыдағы p флагтары өрісін қараңыз. 0x1C 0x30 4 8 0 және 1 туралауды білдірмейді. Әйтпесе, 2-нің бүтін дәрежесі болуы керек, эквиваленттік модуль . 0x20 0x38 Бағдарлама тақырыбының соңы (өлшемі).

Бөлімнің атауы

OffsetSize (байттар)FieldPurpose32 bit64 bit32 bit64 bit0x004sh nameShstrtab бөліміндегі осы бөлімнің атауын көрсететін жолға смещение.0x044sh typeОсы заголовоктың типін анықтайды. ValueNameMeaning0x0SHT NULLБөлім заголовок кестесі пайдаланылмаған0x1SHT PROGBITSБағдарлама деректері0x2SHT SYMTABСимволдар кестесі0x3SHT STRTABЖолдар кестесі0x4SHT RELARқосымшалары бар қайта орналастыру жазбалары0x5SHT HASHSимволдардың хэш кестесі0x6SHT DYNAMICДинамикалық байланыс ақпараты0x7SHT NOTENotes0x8SHT NOBITSДерексіз бағдарлама кеңістігі (bss)0x9SHT RELқосымшалары жоқ қайта орналастыру жазбалары0x0ASHT SHLIBReserved0x0BSHT DYNSYMDynamic linker символдар кестесі0x0ESHT INIT ARRAYКонструкторлар массиві0x0FSHT FINI ARRAYДеструкторлар массиві0x10SHT PREINIT ARRAYАлдын ала конструкторлар массиві0x11SHT GROUPБөлімдер тобы0x12SHT SYMTAB SHNDXКейбір бөлімдердің кеңейтілген индекстері0x13SHT NUMҚолданылған типтер саны0x60000000SHT LOOSОперациялық жүйеге қатысты басталады0x0848sh flagsБөлімнің атрибуттарын анықтайды. ValueNameMeaning0x1SHF WRITEЖазуға болады0x2SHF ALLOCOрындалу кезінде жадты алады0x4SHF EXECINSTROрындалатын0x10SHF MERGEБіріктірілуі мүмкін0x20SHF STRINGSНөлдікпен аяқталатын жолдарды қамтиды0x40SHF INFO LINK'sh info' SHT индексін қамтиды0x80SHF LINK ORDERБіріктіргеннен кейін реттілікті сақтау0x100SHF OS NONCONFORMINGСтандарт емес операциялық жүйеге қатысты өңдеуді қажет етеді0x200SHF GROUPБөлім топтың мүшесі0x400SHF TLSБөлім жергілікті деректерді сақтайды0x0FF00000SHF MASKOSОперациялық жүйеге қатысты0xF0000000SHF MASKPROCПроцессорға қатысты0x4000000SHF ORDEREDАрнайы реттелу талабы (Solaris)0x8000000SHF EXCLUDEЕгер сілтеме жасалмаса немесе бөлінбесе, бөлім шығарылады (Solaris)0x0C0x1048sh addrЖадтағы бөлімнің виртуальды мекенжайы, жүктелген бөлімдер үшін.0x100x1848sh offsetФайлдегі бөлімнің смещениесі.0x140x2048sh sizeФайлдегі бөлімнің байттармен өлшенген көлемі. 0 болуы мүмкін.0x180x284sh linkҚатысты бөлімнің бөлім индексін қамтиды. Бұл өріс бөлімнің типіне байланысты бірнеше мақсатта қолданылады.0x1C0x2C4sh infoБөлім туралы қосымша ақпаратты қамтиды. Бұл өріс бөлімнің типіне байланысты бірнеше мақсатта қолданылады.0x200x3048sh addralignБөлімнің қажетті туралануын қамтиды. Бұл өріс екінің дәрежесі болуы керек.0x240x3848sh entsizeБелгілі өлшемдегі жазбаларды қамтитын бөлімдер үшін әр жазбаның байттармен өлшенген көлемін қамтиды. Әйтпесе, бұл өріс нөлді қамтиды.0x280x40Бөлім заголовок соңы (өлшемі).

Құралдар

readelf – бір немесе бірнеше ELF файлы туралы ақпаратты көрсетуге арналған Unix екілік құралы. GNU Binutils осы бағдарламалық жасақтаманың тегін нұсқасын ұсынады. elfutils тек Linux үшін GNU Binutils құралдарына балама болып табылады. elfdump – Solaris және FreeBSD жүйелерінде қолжетімді ELF файлындағы ELF ақпаратын қарауға арналған команда. objdump ELF файлдары және басқа нысандық форматтар туралы кең ауқымды ақпаратты ұсынады. objdump ELF деректерін құрылымдау үшін екілік файл сипаттамасы кітапханасын пайдаланады. Unix файлдық құралы ELF файлдары туралы, соның ішінде қайта орналастырылатын, орындалатын немесе ортақ нысандық файлдағы код үшін арналған нұсқаулар жиынтығы архитектурасы, немесе ELF өзегінің құлауын тудырған нұсқаулар жиынтығы архитектурасы туралы ақпаратты көрсетуге мүмкіндік береді.

86ашық

86open – Unix және Unix-ке ұқсас операциялық жүйелер үшін ортақ PC-ге үйлесімді x86 архитектурасында ортақ екілік файл пішімі бойынша консенсус құру жобасы болды, мақсаты – бағдарламалық қамтамасыз ету әзірлеушілерін осы архитектураға бағдарламаларын көшіруге (порттауға) ынталандыру. Бастапқы идея – Single UNIX Specification алдындағы Spec 1170 стандартының шағын бөлігінде келісу және өзгертілмеген екілік файлдарды x86 Unix-ке ұқсас операциялық жүйелерде іске қосуға мүмкіндік беретін GNU C кітапханасын (glibc) пайдалану болды. Жоба бастапқыда "Spec 150" деп аталды. Соңында таңдалған формат – ELF, атап айтқанда, Linux жүйесіндегі ELF нұсқасы, ол барлық қатысушы сатушылар мен операциялық жүйелер қолдаған де-факто стандартқа айналды. Топ 1997 жылы электрондық пошта арқылы талқылауды бастады және алғаш рет 1997 жылдың 22 тамызында Санта-Крус операциясы кеңсесінде жиналды. Басқару комитетіне Марк Юинг, Дион Джонсон, Эван Лейбович, Брюс Перренс, Эндрю Роуч, Брайан Уэйн Спаркс және Линус Торвальдс кірді. Жобаға қатысқандардың арасында Кит Бостик, Чак Кранор, Майкл Дэвидсон, Крис Г. Деметриу, Ульрих Дреппер, Дон Даггер, Стив Гинцбург, Джон "маддог" Холл, Рон Холт, Джордан Хаббард, Дейв Дженсен, Кин Джонстон, Эндрю Хози, Роберт Лип, Бела Любкин, Тим Марсланд, Грег Пейдж, Рональд Джо Рекорд, Тим Ракл, Джоэл Сильверштейн, Чиа пи Тьен және Эрик Троан болды. Операциялық жүйелер мен компаниялар: BeOS, BSDI, FreeBSD, Intel, Linux, NetBSD, SCO және SunSoft. Жоба дамыды және 1998 жылдың ортасында SCO, Linux екілік файлдарын OpenServer, UnixWare және Solaris жүйелерінде іске қоса алатын ашық кодты үйлесімділік қабатын – lxrun әзірлеуді бастады. SCO 1999 жылдың наурызында LinuxWorld іс-шарасында lxrun-ға ресми қолдау жариялады. Sun Microsystems 1999 жылдың басында Solaris үшін lxrun-ды ресми түрде қолдауға кірісті, кейіннен Linux екілік форматын Solaris Containers for Linux Applications арқылы толық интеграциялады. BSD жүйелері Linux екілік файлдарын ұзақ уақыттан бері қолдап келеді (үйлесімділік қабаты арқылы), ал негізгі x86 Unix жеткізушілері де форматқа қолдау қосты, соның нәтижесінде жоба Linux ELF-ті индустрия таңдаған формат деп шешіп, 1999 жылдың 25 шілдесінде "өз жұмысын аяқтағанын" жариялады.

FatELF: Linux үшін әмбебап бинарлық файлдар

FatELF – CPU архитектурасының абстракциясына (байт тәртібі, сөз өлшемі, CPU командалар жиынтығы және т.б.) қоса, бағдарламалық платформаның абстракциясын қамтамасыз ететін ELF бинарлық форматының кеңейтімі. Ол Linux және басқа Unix сияқты операциялық жүйелер үшін жасалған. Мысалы, бірнеше ядролық ABI нұсқаларын қолдайтын бинарлық файлдар сияқты, платформалық абстракцияның да артықшылықтары бар. 2021 жылға дейін FatELF негізгі Linux ядросына енгізілмеген.