豫豫言文档API ATLAS
入口包说明.html
97 模块899 名称
← 全部模块

模块 / 97

马赫格式写出。豫

马赫格式写出。豫

20公开名称

马赫页

公开
「整数」

文言:马赫格式者,苹果系统所载之可执行文件也。此写动态可执行之形:零页、文本、数据、链接编辑四段;所导之符,由 dyld 依绑定之码填于数据段之槽;唯链 libSystem;文末附特设之签名,臂之苹果系统无签则不行。汉语:Mach-O 64 位可执行文件写出器(macOS)。生成由 dyld 装载的可执行文件:__PAGEZERO、__TEXT、__DATA、__LINKEDIT 四个段;导入符号经 LC_DYLD_INFO_ONLY 的绑定操作码由 dyld 写进数据段的指针槽;只链接 libSystem;文件末尾附特设(ad-hoc)代码签名,arm64 macOS 不执行未签名的程序。 文言:段以一万六千三百八十四对齐,苹果芯片之页大也;四千九十六之页亦可载。汉语:段按 16 KiB 对齐(Apple 芯片的页大小),4 KiB 页的 x86-64 也能映射。

马赫签页

公开
「整数」

文言:签名每四千九十六字节一散列。汉语:代码签名每 4096 字节一个页散列。

马赫代码偏移

公开
「整数」

文言:代码居文件之一千二十四字节处,亦文本段内之偏;其前为头与诸命令。汉语:代码放在文件偏移 1024(也是 __TEXT 段内偏移),前面是文件头(32 字节)与加载命令(776 字节)。

马赫命令数

公开
「整数」

暂无说明。

马赫命令长

公开
「整数」

暂无说明。

马赫代码虚址

公开
化「整数」而「整数」

文言:代码之虚址,零页之大加代码之偏。汉语:代码起始虚址:__TEXT 紧接 __PAGEZERO,从零页大小处开始。

马赫文本长

公开
化「整数」而「整数」

文言:文本段之长,头、命令与代码合而对齐于页。汉语:__TEXT 段长:文件头、加载命令与代码合计,按页向上对齐。

马赫数据虚址

公开
化「整数」而化「整数」而「整数」

文言:数据段之虚址,续于文本段之后。代码以相对寻址及之,故须先知。汉语:__DATA 段虚址紧接 __TEXT 段;代码用 PC 相对寻址访问数据与导入槽,生成代码前需要它。

马赫名

公开
化「字符串」而「字节串」

文言:段名、节名占十六字节,不足补零。汉语:段名与节名字段:16 字节,右补零。

马赫节

公开
化「字符串」而化「字符串」而化「整数」而化「整数」而化「整数」而化「整数」而化「整数」而「字节串」

文言:节头八十字节:节名、段名、虚址、长、偏、对齐之幂、标。汉语:section_64(80 字节):节名、段名、虚址、长度、文件偏移、对齐(2 的幂次)、标志;无重定位。

马赫段命令

公开
化「字符串」而化「整数」而化「整数」而化「整数」而化「整数」而化「整数」而化(「列」于「字节串」)而「字节串」

文言:段命令:名、虚址、内存之长、文件之偏与长、权,及其诸节。权以读四、写二、执行一相加。汉语:LC_SEGMENT_64(72 字节加每节 80 字节):段名、虚址、内存长、文件偏移、文件长、权限(读 4、写 2、执行 1,最大权限与初始权限相同)及其节。

马赫绑定码

公开
化(「列」于(「字符串」合「整数」))而「字节串」

文言:绑定之码:每导入一符,定库序一、书符名、定类为指针、定段二与其偏、行绑定;终以止码,补零至八之倍。汉语:绑定操作码:每个导入依次为 SET_DYLIB_ORDINAL_IMM 1(libSystem)、SET_SYMBOL_TRAILING_FLAGS_IMM 加以零结尾的符号名、SET_TYPE_IMM 指针、SET_SEGMENT_AND_OFFSET_ULEB(第 2 段即 __DATA,偏移为 ULEB128)、DO_BIND;最后 DONE,补零到 8 的倍数。

马赫代码目录

公开
化「字节串」而化「字节串」而化「整数」而「字节串」

文言:代码目录:以大端书其头八十八字节,次标识,次每页之散列。所签者,文件自首至签名之前也。汉语:CodeDirectory(版本 0x20400,大端):88 字节头,随后是以零结尾的标识,再后是每 4096 字节一个 SHA-256 页散列。签名覆盖从文件开头到签名之前的全部字节;标志为特设签名兼链接器签名(0x20002);可执行段取 __TEXT,标为主程序。

马赫签名

公开
化「字节串」而化「字节串」而化「整数」而「字节串」

文言:签名之超块:唯含代码目录一项。汉语:签名 SuperBlob:只含一个 CodeDirectory(槽类型 0,位于偏移 20)。

马赫尾标

公开
化「整数」而「字节串」

文言:数据段之距:自映像之始至数据段之虚址;小于文本段之长者,数据段紧随文本段。汉语:带数据段距离的版本:最后一个参数是数据段虚址相对映像起址(即 __PAGEZERO 之后)的距离;小于 __TEXT 段长时数据段紧接 __TEXT。文本段与数据段之间的空隙不映射,位置无关的代码可按固定距离找到数据段。 文言:成可执行之文件。臂者,位置无关者,零页之大,代码,入口在代码之偏,数据,数据之内存长,导入之符与其在数据段之偏,签名之标识。代码之虚址与数据之虚址,以「马赫代码虚址」「马赫数据虚址」先求之。命令凡十三:四段;动态装载之讯唯有绑定;符号表空而串表八字节;空之动态符号表;装载器之径;标识取代码与数据散列之前十六字节;平台为苹果桌面,最低十一;主入口;链 libSystem;签名。汉语:生成完整的 Mach-O 可执行文件。参数依次为:是否 arm64(否则 x86-64)、是否位置无关(MH_PIE)、__PAGEZERO 大小(__TEXT 由此开始)、代码、入口在代码内的偏移、数据段初值、数据段内存长(超出初值部分零填充)、导入列表(符号名,如 _write,与其指针槽在数据段内的偏移)、签名标识。代码与数据的虚址可先用「马赫代码虚址」「马赫数据虚址」求出。加载命令共十三条:四个段;LC_DYLD_INFO_ONLY 只有绑定信息(无重定基、弱绑定、延迟绑定与导出表);LC_SYMTAB 无符号、字符串表 8 个零字节;空的 LC_DYSYMTAB;LC_LOAD_DYLINKER;LC_UUID 取代码与数据散列的前 16 字节;LC_BUILD_VERSION 平台 macOS、最低版本 11.0;LC_MAIN;LC_LOAD_DYLIB libSystem;LC_CODE_SIGNATURE。 文言:尾块:大模块附于 __LINKEDIT 之内、签名之前,为签名所覆;其后十六字节为尾标:“YUYANMOD”与八字节之长。执行器自读其文件,依 LC_CODE_SIGNATURE 之 dataoff 寻之。汉语:尾块:把大模块(例如预编后的编译器)放进 __LINKEDIT、代码签名之前(受签名覆盖),其后紧跟 16 字节尾标(“YUYANMOD”加 8 字节长度),尾标正好结束在签名起点。执行器启动时读自己的可执行文件,按 LC_CODE_SIGNATURE 的 dataoff 找到它。块为空时不写尾标。

马赫串表

公开
化(「列」于(「字节串」合「整数」))而「字节串」

文言:调试之符号表:每符一项十六字节(名于串表之偏、类型〇x0e 为节内之局部符、节一即 __text、描述〇、虚址);串表首字节为零,诸名各以零终,补零至八之倍。无符则串表唯八零字节,与旧逐字同。唯供 sample、lldb 诸器示函数之名,不与于装载。汉语:调试符号表(LC_SYMTAB):每个符号一个 16 字节的 nlist_64(名字在串表里的偏移、类型 0x0e 即定义在节内的局部符号、节号 1 即 __text、描述 0、虚址);串表首字节为 0,名字依次以零结尾,末尾补零到 8 的倍数。没有符号时串表只有 8 个零字节,与原先逐字节相同。只供 sample、lldb 等工具显示函数名,不参与装载。

马赫符号项们

公开
化(「列」于(「字节串」合「整数」))而「字节串」

暂无说明。

生成马赫可执行带符号

公开
化「爻」而化「爻」而化「整数」而化「字节串」而化「整数」而化「字节串」而化「整数」而化(「列」于(「字符串」合「整数」))而化「字符串」而化「整数」而化「字节串」而化(「列」于(「字节串」合「整数」))而「字节串」

文言:带符号之版:末参为调试之符号(名与虚址)。汉语:带调试符号的版本:最后一个参数是调试符号(名字字节串与虚址),写进 LC_SYMTAB;其余同「生成马赫可执行带距」。

生成马赫可执行带距

公开
化「爻」而化「爻」而化「整数」而化「字节串」而化「整数」而化「字节串」而化「整数」而化(「列」于(「字符串」合「整数」))而化「字符串」而化「整数」而化「字节串」而「字节串」

暂无说明。

生成马赫可执行

公开
化「爻」而化「爻」而化「整数」而化「字节串」而化「整数」而化「字节串」而化「整数」而化(「列」于(「字符串」合「整数」))而化「字符串」而「字节串」

暂无说明。