Кіріспе
Орындалатын файлдар, объектілік код, ортақ кітапханалар және жүйелік авариялық файлдар үшін файл форматы.
Mach O, Mach объектілік файл форматының қысқартылған атауы, орындалатын файлдар, объектілік код, ортақ кітапханалар, динамикалық түрде жүктелетін код және жүйелік авариялық файлдар үшін қолданылады. Бұл формат a.out форматын алмастыру мақсатымен жасалған. Mach O Mach ядросына негізделген кейбір жүйелерде қолданылады. NeXTSTEP, macOS және iOS – бұл форматты түпкілікті орындалатын файлдар, кітапханалар және объектілік код үшін пайдаланатын жүйелердің мысалдары.
Mach-O файлдың макетін
Әрбір Mach O файлы бір Mach O бас жазбасынан тұрады, одан кейін жүктеу командаларының тізімі, содан кейін бір немесе бірнеше сегменттер келеді, олардың әрқайсысында 0 мен 255 аралығындағы бөлімдер болады. Mach O символдарға сілтемелерді өңдеу үшін REL релокация форматын пайдаланады. Символдарды іздегенде Mach O екі деңгейлі атау кеңістігін қолданады, ол әрбір символды «объект/символ аты» жұбы түрінде кодтайды, содан кейін алдымен объект, содан кейін символ аты бойынша сызықты іздеу жүргізіледі. Деректердің басқа бөліктеріне сілтеме беруге арналған өзгермелі ұзындығы бар «жүктеу командаларының» тізімі сияқты негізгі құрылым Accent атқарылатын файл форматында да қолданылды. Accent файл форматы Spice Lisp идеясы негізінде жасалған. Барлық дерек құрылымдарындағы барлық көп байттық мәндер код жасалған хосттың байт ретімен жазылады.
Сегменттер мен секциялардың нөмірлері
Сегменттер мен бөлімдер сығылған және сығылмаған сілтемелерді өңдеу ақпаратының бөлімдерінде сегмент нөмірі және бөлім нөмірі бойынша орналасқан. Сегменттің мәні 3 болса, бұл Mach O файлындағы төртінші сегмент жүктеу командасы деректеріне нөлден бастап (0,1,2,3 = 4-ші сегмент) жасалған ауытқуды білдіреді. Бөлімдер де 1-ден және одан жоғары сандармен нөмірленеді. Бөлім нөмірінің нөлдік мәні символдар кестесінде ешбір бөлімде анықталмаған (белгісіз) символдар үшін қолданылады. Мысалы, әдіс немесе басқа бинарлық файлдың символдар кестесі бөліміндегі деректер. 7 бөлімнен тұратын сегменттің соңғы бөлімі 8 болады. Егер келесі сегмент жүктеу командасында 3 бөлім болса, олар 9, 10 және 11 бөлімдер ретінде табельденеді. 10-шы бөлім екінші сегменттің 2-ші бөлімін білдіреді. Бөлімдердің оқылу ретін және олардың мекенжайы/файлдегі орнын сақтамасақ, символдар кестесі мен байланыс туралы ақпаратты дұрыс оқи алмаймыз. Символдарды оқу құралын жасау үшін және сілтемелерді өңдеу бөлімдерін оқу үшін, тіпті әдіс шақыруларын картаға түсіруге немесе декомпилятор құруға RAM мекенжайларын және орын ауыстыруларын пайдаланбай, файлдегі ауытқуды оңай қолдануға болады. Егер Mach O жүктеушісін құрастырсаңыз, бөлімдерді анықталған RAM мекенжайларына және қосымшалардың бір-бірін жазбауы үшін базалық мекенжайға құю қажет. Сегменттер мен бөлімдердің атауларын қалағандай өзгертуге болады, егер сегмент командаларының ретін өзгертпесеңіз, бөлімдер нөмірі бойынша тиісті бөлімдерді табуда ешқандай қиындық болмайды.
Сілтеме кітапханасының реттік нөмірлері
Кітапхана компрессияланған және компрессияланбаған сілтемелерді өңдеу ақпаратының бөлімдерінде реттік нөмірмен көрсетіледі. Сілтеме кітапханалары 1-ден бастап нөмірленеді. Нөлдік ординарлық мән символ кестесінде символдың басқа Mach-O бинарлық файлында сыртқы символ ретінде жоқ екенін көрсету үшін пайдаланылады. Сілтеме өңдеу ақпараты сілтеме кітапханасы командаларының енгізілу ретін өзгертпесеңіз, ординарлық нөмір бойынша оқуға қажетті кітапхананы табуда қиындық тудырмайды. Орындалу жылдамдығы үшін link library командасын пайдаланудан аулақ болу керек, себебі кітапхана жоқ болған жағдайда, барлық жүктелген сілтеме кітапханалары бойынша іздеу жасалуы тиіс.
Символдар кестесі
Символдар кестесінің жазбалары барлық түрлері бойынша ретпен сақталады. Алғаш оқылған символдар – жергілікті түзету символдары (болған жағдайда), содан кейін жеке символдар, одан кейін сыртқы символдар, және соңында басқа бинарлық символдар кестесіндегі сыртқы символдың мекенжайын қамтитын, анықталмаған символдар болады. Символдар кестесі туралы ақпаратты жүктеу командасы, Mach O бинарлық файлында символдар кестесі бөлімі болған жағдайда, әрқашан болады. Бұл команда байланыстырушыға қанша жергілікті, жеке, сыртқы және анықталмаған символдар бар екенін хабарлайды. Сондай-ақ, олардың басталатын символ нөмірін анықтайды. Динамикалық байланыстырушы символдар жазбаларын оқымас бұрын, символдар кестесі туралы ақпарат қолданылады, себебі ол динамикалық байланыстырушыға анықталмаған символдарды жүктеу үшін символдарды қайдан оқуды бастау керектігін, ал барлық символдар жазбаларын оқымай, сәйкес сыртқы символдарды іздеу үшін қайдан оқуды бастау керектігін көрсетеді. Символдар бөліміндегі символдардың ретін өзгертуге болмайды, өйткені әрбір символ нөлден бастап нөмірленеді. Символдар кестесі туралы ақпарат командасы, символ нөмірлерін анықталмаған символдарды кіші бөлімдерге және көрсеткіштер бөліміне жүктеу үшін пайдаланады. Ретті өзгерту машиналық кодты орындау кезінде дұрыс емес әдісті шақыруға алып келеді.
Тікелей емес кесте
Mach O жүктеуіші сегмент жүктеу командалары кезінде символ көрсеткіш бөлімдері мен символ кесінді бөлімдерін жазады. Олар әдіс шақыруларын жүктеу үшін жанама символ кестесімен тізбектей қолданылады. Бөлім соңына жеткен соң, келесі бөлімге өтеміз. Жанама символ кестесінің ығысуы 32 биттік (4 байттық) мәндер жиынтығына сілтеме жасайды, олар символ нөмірінің индексі ретінде қолданылады. Символ индексінің нөмірлерінің реті – көрсеткіш және кесінді бөлімдерінде әрбір символ адресінің жазылу ретімен сәйкес келеді. Символ кесінді бөлімі басқа Mach O бинарлық файлынан әдіс/функцияны шақыру үшін жанама символ адресіне JUMP нұсқаулары бар машиналық код нұсқауларын қамтиды. Әрбір JUMP нұсқаулығының мөлшері процессор түріне байланысты және сегмент жүктеу командасының 32/64 бөліміндегі резервтелген2 мәнінде сақталады. Көрсеткіш бөлімдері 32 биттік (4 байттық) Mach O бинарлықтары үшін 32 биттік мекенжай мәндерін, ал 64 биттік (8 байттық) Mach O бинарлықтары үшін 64 биттік мекенжай мәндерін қамтиды. Көрсеткіштер машиналық кодпен оқылады және оқылған мән машиналық код нұсқауларын қамтимай, әдіс/функцияны шақыру орны ретінде қолданылады. Символ индексінің біттері абсолютті әдістерді білдіреді, яғни көрсеткіш әдістің нақты мекенжайына сілтеме жасайды. Символ индексінің біттері жергілікті әдістерді білдіреді, яғни көрсеткіш өзі әдіске сілтеме жасайды және әдіс атауы жоқ (жергілікті әдіс). Егер сіз декомпилятор құрастырсаңыз, сіз басқа Mach O файлдарындағы анықталмаған символ адресін іздемей, әрбір кесінді мен көрсеткіштің ығысу адресіне символ атауын тікелей бейнелей аласыз, осылайша әдіс немесе функция шақырылуын көрсете аласыз.
Басқа іске асырулар
Mach O қолданбасы, егер сіздің компьютеріңіздегі негізгі типке сәйкес Mach O бинарлық бейнесі болса, әртүрлі операциялық жүйелерде немесе ОЖ-да жұмыс істей алады. Көптеген десктоптар x86 болып табылады, яғни сіз бөлімдерді жадыға жүктесеңіз, x86 бинарлы Mach O қатесіз жұмыс істейді. Егер Mach O iPhone үшін, ARM негізі бар құрылғы үшін жасалса, оны іске қосу үшін ARM негізі бар компьютер қажет (бұл Apple кремний ARM болуы міндетті емес); әйтпесе, ARM кодталған нұсқауларды x86 кодталған нұсқауларға түрлендіру қажет. Mach O жүктеу және тікелей орындау мәселесі – басқа операциялық жүйеде жоқ басқа Mach O бинарлық файлдарынан функцияларды/әдістерді шақыратын анықталмаған символдар. Кейбір символдар басқа операциялық жүйелердегі эквивалентті функцияларды шақыруы мүмкін, тіпті басқа екілік функцияларды macOS эквиваленттері сияқты жұмыс істеуі үшін адаптер функцияларын шақыруы мүмкін. Құрылғыда сақталған Mach O файлдары iPhone (iOS), macOS, watchOS және tvOS арасында өзгеше болуы мүмкін, бұл анықталмаған символдардан функция шақыруда айырмашылықтарға әкеледі. NetBSD-дің кейбір нұсқалары Mac OS 10.3 бинарлық файлдарын орындауға мүмкіндік беретін бинарлық үйлесімділіктің бір бөлігі ретінде Mach O қолдауын қосты. Linux үшін Shinichiro Hamaji 10.6 бинарлық файлдарын жүктей алатын Mach O жүктеушісін жасады. Бұл жүктеушіге негізделген кеңейтілген шешім ретінде Darling жобасы macOS қолданбаларын Linux-та іске қосуға мүмкіндік беретін толық ортаны ұсынуды мақсат етеді. Ruby бағдарламалау тілі үшін ruby macho кітапханасы Mach O бинарлық талдаушысы мен редакторларын ұсынады.