原生装载。豫
yuyan · 216 行 · 13927 字节 · UTF-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
寻观「底层库」之书。
寻观「客体二号」之「布局」之书。
寻观「客体二号」之「林系统」之书。
寻观「客体二号」之「苹系统」之书。
寻观「客体二号」之「平台」之书。
寻观「客体二号」之「基础」之书。
「:文言:原生宿主之装载:执行器未嵌客体者,以首参为模块之径,读之于动态区之首,如大程序然;程序名易为此径,首参去之。于是同一执行器,或嵌客体而为独立之可执行文件,或受 .wasm 之径而为原生之宿主。汉语:原生宿主形态的装载:执行器里没有嵌入客体模块(状态_模块长 为 0)时,把第一个命令行参数当作 .wasm 模块路径,读进动态区开头(与运行磁盘上的大程序相同:置 状态_主程序大,解析模块把模块址设为 区域起),程序名改为这个路径,并从参数中去掉它。这样同一份执行器既可以嵌入客体成为独立可执行文件,也可以作为原生宿主运行任意 .wasm:`yy原生宿主 程序.wasm 参数…`。打不开或太大时打印原因并以 127 退出。:」
「原生开读」乃化「整数」而「整数」也。
「原生开读」者会「路径」而
若「是苹」于「元」则
「苹_开」于(「减」于「零」于「二」)于「路径」于「一六七七七二一六」于「零」
否则
「林_开」于(「减」于「零」于「一零零」)于「路径」于「五二四二八八」于「零」
也。
「:文言:文件之长:苹果以 fstat(st_size 在九十六),Linux 以 statx(stx_size 在四十)。汉语:已打开文件的长度(低 32 位):macOS 用 fstat(st_size 在 96),Linux 用 statx 加 AT_EMPTY_PATH(stx_size 在 40);出错返回 -1。:」
「原生文件长」乃化「整数」而化「整数」而「整数」也。
「原生文件长」者会「柄」而会「缓」而
虑「果」者
若「是苹」于「元」则
「苹_柄状态」于「柄」于「缓」
否则
「林_状态」于「柄」于(「静态串」于『』)于「四零九六」于「二零四七」于「缓」
而
若「小于」于「果」于「零」则
(「减」于「零」于「一」)
否则
「读四」于(「加」于「缓」于(「选择」于(「是苹」于「元」)于「九六」于「四零」))
也。
「原生读满」乃化「整数」而化「整数」而化「整数」而化「整数」而「整数」也。
「原生读满」者会「柄」而会「址」而会「长」而会「已」而
若「有符号大等」于「已」于「长」则
「已」
否则
虑「数」者
若「是苹」于「元」则
「苹_读」于「柄」于(「加」于「址」于「已」)于(「减」于「长」于「已」)
否则
「林_读」于「柄」于(「加」于「址」于「已」)于(「减」于「长」于「已」)
而
若「有符号小等」于「数」于「零」则「已」否则「原生读满」于「柄」于「址」于「长」
于(「加」于「已」于「数」)
也。
「原生装载失败」乃化「整数」而「有」也。
「原生装载失败」者会「串」而
虑「无」者「打印零串」于「串」而
虑「无」者「写字节」于「一零」而
「退出任务」于「一二七」
也。
「:文言:定位之读:苹果以 pread,Linux 以 pread64。汉语:按偏移读(macOS pread,Linux pread64),偏移只用低 32 位。:」
「原生定读」乃化「整数」而化「整数」而化「整数」而化「整数」而「整数」也。
「原生定读」者会「柄」而会「址」而会「长」而会「偏」而
若「是苹」于「元」则
「苹_定读」于「柄」于「址」于「长」于「偏」
否则
「林_定读」于「柄」于「址」于「长」于「偏」
也。
「原生定读满」乃化「整数」而化「整数」而化「整数」而化「整数」而化「整数」而「整数」也。
「原生定读满」者会「柄」而会「址」而会「长」而会「偏」而会「已」而
若「有符号大等」于「已」于「长」则
「已」
否则
虑「数」者「原生定读」于「柄」于(「加」于「址」于「已」)于(「减」于「长」于「已」)于(「加」于「偏」于「已」)而
若「有符号小等」于「数」于「零」则「已」否则「原生定读满」于「柄」于「址」于「长」于「偏」于(「加」于「已」于「数」)
也。
「:文言:苹果之尾标所在:解 Mach-O 之首,寻 LC_CODE_SIGNATURE(二十九),尾标终于其 dataoff。汉语:macOS 可执行文件里尾标的位置:读文件开头 4 KiB,逐条看加载命令(第 16 字节起是命令数,命令从第 32 字节开始),找到 LC_CODE_SIGNATURE(29)后,尾标结束于它的 dataoff;找不到返回 -1。:」
「原生苹尾偏」乃化「整数」而化「整数」而化「整数」而「整数」也。
「原生苹尾偏」者会「缓」而会「位」而会「剩」而
若「或者」于(「有符号小等」于「剩」于「零」)于(「有符号大等」于「位」于「四零八八」)则
(「减」于「零」于「一」)
否则若「等」于(「读四」于(「加」于「缓」于「位」))于「二九」则
「减」于(「读四」于(「加」于(「加」于「缓」于「位」)于「八」))于「一六」
否则
虑「长」者「读四」于(「加」于(「加」于「缓」于「位」)于「四」)而
若「有符号小等」于「长」于「零」则
(「减」于「零」于「一」)
否则
「原生苹尾偏」于「缓」于(「加」于「位」于「长」)于(「减」于「剩」于「一」)
也。
「:文言:可执行文件自带之模块:尾标为“YUYANMOD”加八字节之长,模块居其前。Linux 之尾标在文件之末,苹果之尾标终于签名之始。得之则读入动态区之首如大程序。汉语:读取可执行文件自带的模块(预编的大程序用,见 马赫格式写出 与 Linux可执行 的尾块):尾标是 16 字节(“YUYANMOD”加 8 字节长度),模块紧挨在尾标之前;Linux 的尾标在文件末尾,macOS 的尾标结束于代码签名的起点。找到就像磁盘上的大程序一样读进动态区开头并置 状态_主程序大,返回阳;没有尾标返回阴。:」
「原生装载内嵌」乃化「整数」而「爻」也。
「原生装载内嵌」者会「路径」而
虑「柄」者「原生开读」于「路径」而
若「小于」于「柄」于「零」则
「阴」
否则
虑「缓」者「送参数区」而
虑「文长」者「原生文件长」于「柄」于「缓」而
虑「尾偏」者
(若「是苹」于「元」则
(若「小于」于(「原生定读满」于「柄」于「缓」于「四零九六」于「零」于「零」)于「四零九六」则
(「减」于「零」于「一」)
否则
「原生苹尾偏」于「缓」于「三二」于(「读四」于(「加」于「缓」于「一六」)))
否则
「减」于「文长」于「一六」)
而
虑「读标」者
(若「小于」于「尾偏」于「一六」则「零」否则「原生定读满」于「柄」于「缓」于「一六」于「尾偏」于「零」)
而
若「或者」
于(「小于」于「读标」于「一六」)
于(「或者」
于(「不等于」于(「读四」于「缓」)于「一零九六三七三五九三」)
于(「不等于」于(「读四」于(「加」于「缓」于「四」))于「一一四六零四七八二二」))
则
((若「是苹」于「元」则「苹_关」于「柄」否则「林_关」于「柄」);「阴」)
否则
虑「模长」者「读四」于(「加」于「缓」于「八」)而
虑「起」者「减」于「尾偏」于「模长」而
虑「需页」者「无符号除」于(「加」于(「加」于「区域起」于「模长」)于「六五五三五」)于「六五五三六」而
虑「今页」者「内存页数」于「元」而
虑「增」者(若「无符号大于」于「需页」于「今页」则「内存增长」于(「减」于「需页」于「今页」)否则「零」)而
若「小于」于「增」于「零」则
((「原生装载失败」于(「静态串」于『原生:内嵌模块过大,内存不足』));「阴」)
否则
虑「读数」者「原生定读满」于「柄」于「区域起」于「模长」于「起」于「零」而
虑「无」者(若「是苹」于「元」则「苹_关」于「柄」否则「林_关」于「柄」)而
虑「无」者「写四」于「状态_模块长」于「读数」而
虑「无」者「写四」于「状态_主程序大」于「一」而
「阳」
也。
「:文言:自身之径:程序名区之径,补零于送程序名区。汉语:可执行文件自身的路径:程序名区里的路径(Linux 是 /proc/self/exe 的目标,macOS 是 exec 时的路径)拷到送程序名区并补结尾零。:」
「原生自身路径」乃化「有」而「整数」也。
「原生自身路径」者会「无」而
虑「长」者「选择」于(「大于」于(「读四」于「程序名区」)于「一零零零」)于「一零零零」于(「读四」于「程序名区」)而
虑「无」者「拷贝」于「送程序名区」于(「加」于「程序名区」于「四」)于「长」而
虑「无」者「写一」于(「加」于「送程序名区」于「长」)于「零」而
「送程序名区」
也。
「原生装载程序」乃化「有」而「有」也。
「原生装载程序」者会「无」而
若「不等于」于(「读四」于「状态_模块长」)于「零」则
「元」
否则若「原生装载内嵌」于(「原生自身路径」于「元」)则
「元」
否则若「等零」于(「读四」于「参数区」)则
「元」
否则
虑「首长」者「读四」于(「加」于「参数区」于「四」)而
若「或者」于(「有符号小等」于「首长」于「零」)于(「大于」于「首长」于「一零零零」)则
「原生装载失败」于(「静态串」于『原生宿主:程序路径为空或过长』)
否则
虑「路径」者「送程序名区」
而
虑「无」者
「拷贝」于「路径」于(「加」于「参数区」于「八」)于「首长」
而
虑「无」者「写一」于(「加」于「路径」于「首长」)于「零」
而
虑「柄」者「原生开读」于「路径」
而
若「小于」于「柄」于「零」则
「原生装载失败」于(「静态串」于『原生宿主:无法打开程序』)
否则
虑「长」者「原生文件长」于「柄」于「送参数区」
而
若「或者」于(「小于」于「长」于「零」)于(「无符号大于」于「长」于「最大主程序长」)则
「原生装载失败」于(「静态串」于『原生宿主:程序过大或无法取长度』)
否则
虑「需页」者
「无符号除」
于(「加」于(「加」于「区域起」于「长」)于「六五五三五」)
于「六五五三六」
而
虑「今页」者「内存页数」于「元」
而
虑「增」者
若「无符号大于」于「需页」于「今页」则「内存增长」
于(「减」于「需页」于「今页」)
否则
「零」
而
若「小于」于「增」于「零」则
「原生装载失败」于(「静态串」于『原生宿主:内存不足』)
否则
虑「读数」者「原生读满」于「柄」于「区域起」于「长」于「零」
而
虑「无」者
(若「是苹」于「元」则「苹_关」于「柄」否则「林_关」于「柄」)
而
虑「无」者「写四」于「状态_模块长」于「读数」
而
虑「无」者「写四」于「状态_主程序大」于「一」
而
虑「名长」者
「选择」
于(「大于」于「首长」于「程序名上限」)
于「程序名上限」于「首长」
而
虑「无」者
「拷贝」于(「加」于「程序名区」于「四」)于「路径」于「名长」
而
虑「无」者「写四」于「程序名区」于「名长」
而
虑「首项长」者
「位与」于(「加」于「首长」于「七」)于(「减」于「零」于「四」)
而
虑「无」者
「拷贝」
于(「加」于「参数区」于「四」)
于(「加」于(「加」于「参数区」于「四」)于「首项长」)
于(「减」于(「减」于「参数区大小」于「四」)于「首项长」)
而
「写四」于「参数区」于(「减」于(「读四」于「参数区」)于「一」)
也。