MetalLibraryArchive เป็นผลิตภัณฑ์ของรูปแบบไฟล์ metallib ของ Apple Reverse-Engineering
คุณสามารถใช้ MetalLibraryArchive เพื่อรับประเภทไลบรารีแพลตฟอร์มเป้าหมายฟังก์ชั่นโลหะ ฯลฯ จากไฟล์ metallib
ข้อมูลที่สกัดของฟังก์ชั่นโลหะรวมถึง:
metallib ได้รับการกำหนดค่าให้รวมซอร์สโค้ด มีให้ที่: https://yuao.github.io/metallibraryexplorer
เรียนรู้เพิ่มเติม
เป้าหมายปฏิบัติการที่เรียกว่า "Explorer" รวมอยู่ในแพ็คเกจ "Explorer" เป็นแอพ GUI ที่สามารถเปิด, แกะและถอดชิ้นส่วน (ด้วยความช่วยเหลือของไฟล์ metallib llvm-dis )
หมายเหตุ ไม่รวม llvm-dis คุณสามารถรับสำเนาของไบนารีได้ที่ https://github.com/llvm/llvm-project/releases
ใช้เมนู "disassembler" ในแอพเพื่อค้นหาไฟล์ปฏิบัติการ llvm-dis

คุณยังสามารถใช้ MetalLibraryArchive เป็นห้องสมุด:
import MetalLibraryArchive
let archive = try Archive ( data : Data ( contentsOf : metallibURL ) )
let libraryType = archive . libraryType
let functions = archive . functions| ช่วงไบต์ | พิมพ์ | เนื้อหา |
|---|---|---|
| 0 ... 3 | FourCharcode | MTLB |
| 4 ... 5 | Uint16 | แพลตฟอร์มเป้าหมาย |
| 6 ... 9 | (UINT16, UINT16) | เวอร์ชันของไฟล์ Metallib (Major, Minor) |
| 10 | Uint8 | ประเภทของไฟล์ metallib |
| 11 | Uint8 | เป้าหมายระบบปฏิบัติการ |
| 12 ... 15 | (UINT16, UINT16) | เวอร์ชันของระบบปฏิบัติการเป้าหมาย (Major, Minor) |
| 16 ... 23 | uint64 | ขนาดของไฟล์ metallib |
| 24 ... 39 | (UINT64, UINT64) | ออฟเซ็ตและขนาดของรายการฟังก์ชั่น |
| 40 ... 55 | (UINT64, UINT64) | ชดเชยและขนาดของส่วนข้อมูลเมตาสาธารณะ |
| 56 ... 71 | (UINT64, UINT64) | ชดเชยและขนาดของส่วนข้อมูลเมตาส่วนตัว |
| 72 ... 87 | (UINT64, UINT64) | ชดเชยและขนาดของส่วน bitcode |
| แพลตฟอร์มเป้าหมาย | ค่า |
|---|---|
| แม็กอส | 0x8001 (0x01,0x80) |
| iOS | 0x0001 (0x01,0x00) |
| ประเภท Metallib | ค่า |
|---|---|
| ที่ปฏิบัติการได้ | 0x00 |
| ภาพหลัก | 0x01 |
| พลวัต | 0x02 |
| สหายสัญลักษณ์ | 0x03 |
| เป้าหมายระบบปฏิบัติการ | ค่า |
|---|---|
| ไม่รู้จัก | 0x00 |
| แม็กอส | 0x81 |
| iOS | 0x82 |
| tvos | 0x83 |
| นาฬิกานาฬิกา | 0x84 |
| Bridgeos (อาจ) | 0x85 |
| Maccatalyst | 0x86 |
| iOS Simulator | 0x87 |
| TVOS Simulator | 0x88 |
| เครื่องจำลอง Watchos | 0x89 |
| ช่วงไบต์ | พิมพ์ | เนื้อหา |
|---|---|---|
| 0 ... 3 | uint32 | จำนวนรายการ (จำนวนฟังก์ชั่น) |
| 4 ... | กลุ่มแท็ก | แต่ละกลุ่มแท็กเก็บข้อมูลบางอย่างเกี่ยวกับฟังก์ชั่นโลหะ |
จำนวนกลุ่มแท็กเท่ากับจำนวนฟังก์ชั่น
| ช่วงไบต์ | พิมพ์ | เนื้อหา |
|---|---|---|
| 0 ... 3 | uint32 | ขนาดของกลุ่มแท็ก |
| 4 ... | แท็ก |
| ช่วงไบต์ | พิมพ์ | เนื้อหา |
|---|---|---|
| 0 ... 3 | FourCharcode | ชื่อของแท็ก |
| 4 ... 5 | Uint16 | ขนาดของแท็ก |
| 6 ... | ไบต์ | เนื้อหาของแท็ก |
| ชื่อ | ประเภทข้อมูลเนื้อหา | เนื้อหา |
|---|---|---|
| ชื่อ | สตริง C-style ที่สิ้นสุด | ชื่อของฟังก์ชัน |
| MDSZ | uint64 | ขนาดของ bitcode |
| พิมพ์ | Uint8 | ประเภทของฟังก์ชัน |
| กัญชา | sha256 digest | แฮชของข้อมูล bitcode (sha256) |
| ออฟที | (UINT64, UINT64, UINT64) | การชดเชยข้อมูลเกี่ยวกับฟังก์ชั่นนี้ในส่วนข้อมูลเมตาสาธารณะส่วนข้อมูลเมตาส่วนตัวและส่วน BitCode |
| ทำให้งอ | uint64 | ออฟเซ็ตของรหัสแหล่งที่มาเก็บถาวรของฟังก์ชั่นในส่วนซอร์สโค้ดแบบฝังตัว |
| นคร | (UINT16, UINT16, UINT16, UINT16) | BitCode และภาษา (Air.Major, Air.minor, Language.major, Language.minor) |
| ชั้น | Uint8 | ประเภทโลหะของ render_target_array_index (สำหรับการเรนเดอร์เลเยอร์) |
| ความวุ่นวาย | Uint8 | ประเภทแพตช์และจำนวนจุดควบคุมต่อแพทช์ (สำหรับฟังก์ชั่นจุดสุดยอดโพสต์-เทสเทส) |
| ตอนท้าย | สิ้นสุดกลุ่มแท็ก |
| ประเภทฟังก์ชัน | ค่า | บันทึก |
|---|---|---|
| จุดยอด | 0x00 | |
| ชิ้นส่วน | 0x01 | |
| เคอร์เนล | 0x02 | |
| ไม่มีเงื่อนไข | 0x03 | ฟังก์ชั่นในไลบรารีโลหะไดนามิก |
| มองเห็นได้ | 0x04 | ฟังก์ชั่นที่มี [[visible]] หรือ [[stitchable]] แอตทริบิวต์ |
| ภายนอก | 0x05 | ฟังก์ชั่นภายนอกปฏิบัติตามตัวเลือก -fcikernel |
| จุดตัด | 0x06 |
เนื้อหาของแท็ก TESS :
// Patch types:
// - triangle: 1
// - quad: 2
let content : UInt8 = controlPointCount << 2 | patchTypeมีข้อมูลเกี่ยวกับค่าคงที่ฟังก์ชั่น, แพตช์ tessellation, ประเภทการส่งคืน ฯลฯ
Tags: CNST , VATT , VATY , RETR , ARGR ฯลฯ
มีพา ธ ไปยังไฟล์ shader (แท็ก DEBI ) และ .air (แท็ก DEPF )
มีอยู่เฉพาะในกรณีที่ FunctionListOffset + FunctionListSize + 4 != PublicMetadataOffset
| ช่วงไบต์ | พิมพ์ | เนื้อหา |
|---|---|---|
FunctionListOffset + FunctionListSize + 4 ... | แท็ก | แท็กส่วนขยายส่วนหัว |
| ชื่อ | พิมพ์ | เนื้อหา |
|---|---|---|
| Hdyn | (UINT64, UINT64) | ชดเชยและขนาดของส่วนหัวแบบไดนามิก |
| VLST | (UINT64, UINT64) | ชดเชยและขนาดของรายการตัวแปรที่ส่งออก |
| ilst | (UINT64, UINT64) | ชดเชยและขนาดของรายการสัญลักษณ์ที่นำเข้า |
| HSRD/HSRC | (UINT64, UINT64) | ออฟเซ็ตและขนาดของส่วนซอร์สโค้ดฝังตัว |
| uuid | uuid | UUID ของห้องสมุดโลหะ |
| ตอนท้าย | ปลายส่วนขยายส่วนหัว |
| ชื่อ | ประเภทข้อมูลเนื้อหา | เนื้อหา |
|---|---|---|
| ชื่อ | สตริง C-style ที่สิ้นสุด | ติดตั้งชื่อของไลบรารี |
| Dynl | สตริง C-style ที่สิ้นสุด | Linked Dynamic Library |
รายการตัวแปรและรายการสัญลักษณ์ที่นำเข้ามีโครงสร้างที่คล้ายกับรายการฟังก์ชัน
มีอยู่เฉพาะในกรณีที่กระบวนการสร้าง metallib ได้รับการกำหนดค่าให้รวมซอร์สโค้ด
| ช่วงไบต์ | พิมพ์ | เนื้อหา |
|---|---|---|
| 0 ... 1 | Uint16 | จำนวนรายการในส่วนนี้ |
| 2 ... N | สตริง C-style ที่สิ้นสุด | ตัวเลือกลิงค์ของไฟล์ metallib |
| n ... ม. | สตริง C-style ที่สิ้นสุด | ไดเรกทอรีการทำงาน |
| ม. ... | กลุ่มแท็ก | แท็ก SARC |
หมายเหตุ "ไดเรกทอรีการทำงาน" มีอยู่ใน HSRD เท่านั้น
หมายเหตุ แท็ก SARC ใช้ขนาดเนื้อหา 4-bytes ( UInt32 )
เนื้อหาของแท็ก SARC :
| ช่วงไบต์ | พิมพ์ | เนื้อหา |
|---|---|---|
| 0 ... n | สตริง C-style ที่สิ้นสุด | id ของคลังรหัสที่เก็บถาวร |
| n ... | bzh | คลังข้อมูลซอร์สโค้ดบีบอัด BZIP2 |
| ค่า | พิมพ์ | ค่า | พิมพ์ |
|---|---|---|---|
| 0x00 | ไม่มี | 0x01 | โครงสร้าง |
| 0x02 | อาร์เรย์ | 0x03 | ลอย |
| 0x04 | ลอย 2 | 0x05 | ลอย 3 |
| 0x06 | ลอยน้ำ 4 | 0x07 | ลอย 2x2 |
| 0x08 | ลอย 2x3 | 0x09 | ลอย 2x4 |
| 0x0a | ลอย 3x2 | 0x0b | ลอย 3x3 |
| 0x0c | ลอย 3x4 | 0x0d | float4x2 |
| 0x0e | float4x3 | 0x0f | float4x4 |
| 0x10 | ครึ่ง | 0x11 | Half2 |
| 0x12 | Half3 | 0x13 | Half4 |
| 0x14 | half2x2 | 0x15 | half2x3 |
| 0x16 | half2x4 | 0x17 | half3x2 |
| 0x18 | half3x3 | 0x19 | half3x4 |
| 0x1a | half4x2 | 0x1b | half4x3 |
| 0x1c | half4x4 | 0x1d | int |
| 0x1e | INT2 | 0x1f | INT3 |
| 0x20 | INT4 | 0x21 | uint |
| 0x22 | Uint2 | 0x23 | uint3 |
| 0x24 | uint4 | 0x25 | สั้น |
| 0x26 | short2 | 0x27 | สั้น 3 |
| 0x28 | สั้น 4 | 0x29 | ushort |
| 0x2a | ushort2 | 0x2b | ushort3 |
| 0x2c | ushort4 | 0x2d | ถ่าน |
| 0x2e | Char2 | 0x2f | Char3 |
| 0x30 | Char4 | 0x31 | uchar |
| 0x32 | uchar2 | 0x33 | uchar3 |
| 0x34 | uchar4 | 0x35 | บูล |
| 0x36 | บูล 2 | 0x37 | บูล 3 |
| 0x38 | บูล 4 | 0x3a | พื้นผิว |
| 0x3b | ตัวอย่าง | 0x3c | ตัวชี้ |
| 0x3e | r8unorm | 0x3f | r8snorm |
| 0x40 | r16unorm | 0x41 | r16snorm |
| 0x42 | rg8unorm | 0x43 | rg8snorm |
| 0x44 | RG16unorm | 0x45 | rg16snorm |
| 0x46 | rgba8unorm | 0x47 | rgba8unorm_srgb |
| 0x48 | rgba8snorm | 0x49 | rgba16unorm |
| 0x4a | rgba16snorm | 0x4b | RGB10A2UNORM |
| 0x4c | rg11b10float | 0x4d | rgb9e5float |
| 0x4e | RenderPipeline | 0x4f | ComputePipeline |
| 0x50 | ผู้บัญชาการทางอ้อม | 0x51 | ยาว |
| 0x52 | Long2 | 0x53 | Long3 |
| 0x54 | Long4 | 0x55 | ชาวอุย |
| 0x56 | Ulong2 | 0x57 | Ulong3 |
| 0x58 | ulong4 | 0x59 | สองเท่า |
| 0x5a | สองเท่า | 0x5b | สองเท่า |
| 0x5c | สองเท่า | 0x5d | ลอยน้ำ 8 |
| 0x5e | ลอย 16 | 0x5f | ครึ่ง 8 |
| 0x60 | Half16 | 0x61 | int8 |
| 0x62 | Int16 | 0x63 | Uint8 |
| 0x64 | Uint16 | 0x65 | สั้น 8 |
| 0x66 | สั้น 16 | 0x67 | ushort8 |
| 0x68 | ushort16 | 0x69 | Char8 |
| 0x6a | Char16 | 0x6b | uchar8 |
| 0x6c | uchar16 | 0x6d | Long8 |
| 0x6e | Long16 | 0x6f | ulong8 |
| 0x70 | ULONG16 | 0x71 | สองเท่า |
| 0x72 | สองเท่า | 0x73 | Visiblefunctiontable |
| 0x74 | intersectionfunctiontable | 0x75 | PrimitiveAccelerationStructure |
| 0x76 | InstanceAccelerationStructure | 0x77 | บูล 8 |
| 0x78 | บูล 16 |
หากคุณคิดว่ามีข้อผิดพลาดโปรดเปิดปัญหา นอกจากนี้คุณยังสามารถเลือกที่จะเปิดคำขอดึงด้วยการทดสอบความล้มเหลวรวมอยู่ด้วย
โครงการนี้จะไม่เริ่มต้นโดยไม่มีการวิจัยของ Zhuowei ซึ่งเปิดเผยเค้าโครงไบนารีพื้นฐานของไฟล์ metallib รายการฟังก์ชั่นและส่วน BitCode ขอบคุณ @zhuowei!
ฉันพยายามดำเนินการวิจัยต่อไปเพื่อรับโครงสร้างที่สมบูรณ์ของไฟล์ metallib แต่พบว่ามันยากเกินไปที่จะก้าวไปข้างหน้าตามการคาดเดาเพียงอย่างเดียว ดังนั้นฉันจึงหันความสนใจไปที่ Metal.framework หวังว่าจะพบว่าเฟรมเวิร์กโหลดไฟล์ metallib อย่างไร โชคดีที่มันไม่ยากเกินไปหลังจากลาก Metal.framework/Metal เพื่อถอดชิ้นส่วนกระโดด
Metal.framework ใช้ MTLLibraryDataWithArchive::parseArchiveSync(...) เพื่อโหลดไฟล์ metallib มีข้อมูลจำนวนมากที่ซ่อนอยู่ในการชุมนุมของ MTLLibraryDataWithArchive ตัวอย่างเช่น:
ไฟล์เริ่มต้นด้วย 0x424c544d (MTLB); ขนาดของไฟล์ถูกบันทึกที่ออฟเซ็ต 0x10
int __ZN25MTLLibraryDataWithArchive16parseArchiveSyncEPP7NSErrorb ( void * * arg0, bool arg1) {
r12 = rdx;
r14 = arg1;
r13 = arg0;
(*(*arg0 + 0xb8 ))(arg0, 0x0 ); // LibraryWithFile::setPosition(...)
r15 = r13 + 0x78 ;
rbx = (*(*r13 + 0xc0 ))(r13, r15, 0x58 ); // LibraryWithFile::readBytes(...)
rax = *r13;
rax = (*(rax + 0xc8 ))(r13); // LibraryWithFile::getFileSize(...)
// 0x424c544d - MTLB
// File size field offset: 0x88 - 0x78 = 0x10
if (((rbx != 0x58 ) || (*( int32_t *)(r13 + 0x78 ) != 0x424c544d )) || (*(r13 + 0x88 ) != rax)) goto loc_6a65b;
...
loc_6a65b:
if (r14 == 0x0 ) goto loc_6a6c5;
loc_6a660:
rdx = @ " Invalid library file " ;
...
} ค่า Int16 ที่ออฟเซ็ต 0x4 เกี่ยวข้องกับแพลตฟอร์มเป้าหมาย
loc_6a610:
// 0x7c - 0x78 = 0x4
rax = *( int16_t *)(r13 + 0x7c ) & 0xffff ;
if ((rax >= 0x0 ) || (r12 == 0x0 )) goto loc_6a6ea;
loc_6a627:
if (r14 == 0x0 ) goto loc_6a6c5;
loc_6a630:
rdx = @ " This library format is not supported on this platform (or was built with an old version of the tools) " ;
goto loc_6a689;มี "ส่วนขยายส่วนหัว" ที่มีข้อมูลเกี่ยวกับ "ส่วนหัวแบบไดนามิก", "รายการสัญลักษณ์นำเข้า" และ "รายการตัวแปร":
if (MTLLibraryDataWithArchive::parseHeaderExtension(r13, r13 + 0x100 , r14) != 0x0 ) {
if ( MTLLibraryDataWithArchive::parseDynamicHeaderSection (r13) != 0x0 ) {
if ( MTLLibraryDataWithArchive::parseImportedSymbolListSection (r13) != 0x0 ) {
rax = MTLLibraryDataWithArchive::parseVariableListSection (r13);
} else {
rax = 0x0 ;
}
} else {
rax = 0x0 ;
}
} else {
rax = 0x0 ;
}BitCode ได้รับการตรวจสอบความถูกต้องโดยใช้ SHA256
int ____ZN25MTLLibraryDataWithArchive15validateBitCodeEmmPK6NSDataRK12MTLUINT256_t_block_invoke ( int arg0) {
...
CC_SHA256_Init (&var_B0);
CC_SHA256_Update (&var_B0, r14, *( int32_t *)(r15 + 0x38 ));
CC_SHA256_Final (&var_48, &var_B0);
...
}รหัส fourcc จำนวนมาก:
// 0x454e4454 - ENDT
loc_6a8bc:
if (rax == 0x454e4454 ) goto loc_6a871;
...
// 0x54595045 - TYPE
loc_6a984:
if (rax == 0x54595045 ) goto loc_6a9dc;
...
// 0x44594e4c - DYNL
loc_6ae5b:
if (rax != 0x44594e4c ) goto loc_6b002;
...
// 0x56455253 - VERS
loc_6b731:
if (rax == 0x56455253 ) goto loc_6b81c; หลังจากขุดรอบ ๆ ฉันก็สามารถได้รับภาพรวมของโครงสร้างไฟล์ metallib :
ไฟล์มีส่วนหัว 88 ไบต์ที่มีเวอร์ชันไฟล์แพลตฟอร์มเป้าหมายประเภทไลบรารีดัชนีส่วน ฯลฯ
มี 4 ส่วนที่บันทึกไว้ในส่วนหัวไฟล์:
รายการฟังก์ชัน
ข้อมูลเมตาสาธารณะ
ข้อมูลเมตาส่วนตัว
โมดูล BitCode
แต่ละส่วนจะถูกบันทึกด้วยออฟเซ็ตและขนาด ซึ่งหมายความว่าส่วนอาจไม่ต่อเนื่องกันซึ่งช่วยให้ Apple สามารถแนะนำส่วนใหม่ในระหว่างได้โดยไม่ทำลายความเข้ากันได้ และ Apple ก็ทำเช่นนั้นสำหรับส่วน "ส่วนขยายส่วนหัว" - มันอยู่ระหว่างรายการฟังก์ชั่นและส่วนข้อมูลเมตาสาธารณะ
ส่วนส่วนใหญ่ (ยกเว้นส่วน bitcode) มีลักษณะคล้ายกับโครงสร้างที่ใช้ "แท็ก":
FourCharcode ใช้เป็นชื่อ/ประเภทของแท็ก
ค่า UInt16 (ในกรณีส่วนใหญ่) ขนาดตามชื่อของแท็ก
แท็กข้อมูลที่เก็บถาวรแหล่งที่มา SARC ใช้ค่า UInt32 อย่างไม่น่าเชื่อสำหรับขนาดของมัน - แหล่งเก็บถาวรแหล่งที่มาสามารถเกิน 65KB ได้อย่างง่ายดาย
แท็กถูกจัดกลุ่ม:
แต่ละกลุ่มแสดงชุดของคุณสมบัติของรายการ
กลุ่มแท็กลงท้ายด้วยแท็ก ENDT
ต่อไปฉันต้องทราบว่าข้อมูลใดที่แต่ละแท็ก/ฟิลด์เก็บไว้ นี่อาจเป็นเรื่องยากที่จะได้รับจากการชุมนุมของ Metal.framework เพราะ:
บางฟิลด์อาจได้รับการออกแบบอย่างหมดจดสำหรับเครื่องมือหรือการดีบักดังนั้น MTLLibraryDataWithArchive อาจไม่สนใจพวกเขา
แอสเซมบลีขึ้นอยู่กับแพลตฟอร์ม ตัวอย่างเช่น MTLLibraryDataWithArchive เวอร์ชัน iOS อาจตรวจสอบได้ว่า metallib นั้นถูกสร้างขึ้นสำหรับ iOS หรือไม่และไม่สามารถบอกได้ว่าห้องสมุดถูกสร้างขึ้นสำหรับ MacOS หรือไม่
บางสาขายากที่จะวิเคราะห์และติดตาม ตัวอย่าง:
มี 3 ออฟเซ็ตในแท็ก OFFT ของฟังก์ชั่นพวกเขาชี้ไปที่ไหน? และในที่สุดพวกเขาก็ใช้อย่างไร?
ค่าที่เป็นไปได้ของประเภทฟังก์ชันคืออะไร? ค่าแต่ละค่าหมายถึงอะไร?
ดูเหมือนว่าวิธีที่เร็วที่สุดในการรับข้อมูลนี้คือการทดลอง
ฉันเริ่มต้นด้วยการรวบรวมไฟล์ metal ด้วยตัวเลือกตัวเลือกและ SDK ที่แตกต่างกันจากนั้นตรวจสอบแต่ละฟิลด์ที่ฉันสนใจเดสก์ท็อปของฉันถูกน้ำท่วมอย่างรวดเร็วด้วยไฟล์ metallib และหน้าต่าง hexfiend แต่ฉันไม่พบข้อมูลที่เป็นประโยชน์มากนัก ฉันต้องการบางสิ่งที่สามารถสร้าง metallib โดยอัตโนมัติและนำเสนอเฉพาะสาขาที่ฉันสนใจ
ฉันมากับ "การคาดเดาขับเคลื่อนทดสอบ":
เขียนตัวแยกวิเคราะห์ metallib ตามภาพรวมโครงสร้างไบนารีที่มือ
ในตัวแยกวิเคราะห์ให้บันทึกค่าของฟิลด์/แท็ก (หรือบางเขตข้อมูลที่เกี่ยวข้อง) ที่ไม่ทราบในปัจจุบัน
สร้างการทดสอบที่สร้างไฟล์ metallib โดยใช้ shaders ชนิดต่าง ๆ และตัวเลือกรวบรวมที่อาจส่งผลกระทบต่อค่าของฟิลด์และใช้ตัวแยกวิเคราะห์เพื่อแยกวิเคราะห์ข้อมูลไฟล์
เรียกใช้การทดสอบและวิเคราะห์บันทึกเพื่อสร้างสมมติฐาน
อัปเดตตัวแยกวิเคราะห์ตามสมมติฐาน
เรียกใช้การทดสอบอีกครั้งเพื่อตรวจสอบ
หลังจากผ่านไปสองสามรอบฉันสามารถรับตารางประเภทฟังก์ชั่นตารางเป้าหมายระบบปฏิบัติการและความหมายของ 3 ออฟเซ็ตในแท็ก OFFT
ฉันพบบางสิ่งที่น่าสนใจในกระบวนการนี้:
Metal ไม่สนับสนุน WatchOS แต่เป็นไปได้ที่จะสร้าง metallib ที่กำหนดเป้าหมายไปที่ watchos และ Apple มี metallib s บางอย่างใน Watchos SDK (เช่น Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/watchOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreImage.framework/ci_filters.metallib
metallib ที่ว่างเปล่าที่กำหนดเป้าหมาย iOS รุ่นเก่านั้นถูกทำเครื่องหมายว่าเป็นเป้าหมายของ macOS
ฉันไม่สามารถสร้าง metallib ที่มีค่า OS เป้าหมาย 0x85 ตอนแรกฉันคิดว่ามันอาจจะสงวนไว้สำหรับความเป็นจริงที่ซ่อนอยู่ แต่ต่อมาพบว่ามันมีแนวโน้มมากขึ้นสำหรับบริดจ์
10 เม.ย. 2022
แท็กเช่น LAYR , VATY , CNST ฯลฯ มีค่า UInt8 ของชนิดข้อมูลโลหะ คำอธิบายที่สอดคล้องกันสำหรับค่าข้อมูลแต่ละประเภทสามารถเรียกดูได้โดยใช้คลาสส่วนตัวใน Metal.Framework - Mtltypeinternal
id value = [[ NSClassFromString ( @" MTLTypeInternal " ) alloc ] initWithDataType: 0x06 ];
NSLog ( @" %@ " , value.description); // MTLDataTypeFloat4ฉันสร้างเครื่องมือบรรทัดคำสั่งเพื่อสร้างตารางชนิดข้อมูลโลหะ
cd Utilities
swift run metal-data-type-tools gen-markdown --columns 2 # generate a markdown table
swift run metal-data-type-tools gen-swift # generate a Swift enum for Metal data types.31 มี.ค. 2022
air-lld ( Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/metal/ios/bin/air-lld ) ยังให้ข้อมูลมากมายเกี่ยวกับวิธีการสร้างไฟล์ metallib บางส่วนชื่อและคำอธิบายได้รับการอัปเดต
int __ZN4llvm3air20MetalLibObjectWriter5writeEv () {
r14 = rdi;
rax = llvm::air::MetalLibObjectWriter::writeHeader ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_100035135:
rax = llvm::air::MetalLibObjectWriter::writeFunctionList ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_100035141:
rax = llvm::air::MetalLibObjectWriter::writeHeaderExtension ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_10003514d:
rax = llvm::air::MetalLibObjectWriter::writePublicMetadata ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_100035159:
rax = llvm::air::MetalLibObjectWriter::writePrivateMetadata ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_100035165:
rax = llvm::air::MetalLibObjectWriter::writeModuleList ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_100035171:
rax = llvm::air::MetalLibObjectWriter::writeSources ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_10003517d:
rax = llvm::air::MetalLibObjectWriter::writeDynamicHeader ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_100035189:
rax = llvm::air::MetalLibObjectWriter::writeVariableList ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_100035195:
rax = llvm::air::MetalLibObjectWriter::writeImportedSymbolList ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_1000351a1:
rax = llvm::air::MetalLibObjectWriter::computeUUID ();
if (rax != 0x0 ) goto loc_1000351b9;
loc_1000351ad:
rax = llvm::air::MetalLibObjectWriter::backpatchAllLocations ();
if (rax == 0x0 ) goto loc_1000351c2;
loc_1000351b9:
rbx = rax;
goto loc_1000351bb;
loc_1000351bb:
rax = rbx;
return rax;
loc_1000351c2:
rbx = 0x0 ;
std::__1::system_category ();
goto loc_1000351bb;
}