type
status
date
slug
summary
tags
category
icon
password
本文参考的是Unity Editor 2022里面的il2cpp源码
global-metadata结构
unity引擎可以使用il2cpp技术来将c#代码转换成cpp代码再编译成native code从而实现AOT,其中c#脚本里面的类的信息和都会存储到global-metadata文件里面,这个文件头结构的定义在
GlobalMetadataFileInternals.h
里面。随便的写个unity工程然后使用UnityMetadata模板运行也能看见结构体的信息

文件的魔术头是
AF 1B B1 FA
,后面紧接着的是版本号。这里面是各个元数据段的偏移和数量,具体的各个元数据的定义在il2cpp-metadata.h
文件里面。global-metadata的加载流程
主要参考的是‣,先看看il2cpp的源码吧。
首先是
il2cpp_init
位于il2cpp-api.cpp
Runtime::Init
函数很长,主要看看g_CodegenRegistration
和MetadataCache::Initialize

首先查看
g_CodegenRegistration
:函数不在il2cpp源码里面,这个需要在构建项目的时候勾选develop选项然后再il2cppOutput文件夹里面寻找
Il2CppCodeRegistration.cpp
文件可以看到
g_CodegenRegistration = s_Il2CppCodegenRegistration
这句赋值语句,然后s_Il2CppCodegenRegistration
又调用了il2cpp_codegen_register
,其中传入了三个重要的结构体,g_CodeRegistration
和s_Il2CppCodeGenOptions
结构体就在这个文件中,g_MetadataRegistration
在il2cppOutput文件夹下面的Il2CppMetadataRegistration.c
文件中函数
il2cpp_codegen_register
在il2cpp的源码il2cpp-codegen-il2cpp.cpp
文件里面可以看到这部分就是将三个关键的结构体传递到引擎层。接下来继续看
MetadataCache::Initialize
函数。
至此globa-metadata文件加载流程分析完毕,魔改的话可以寻找
il2cpp_init
函数作为入口点,如果这个函数不存在那么需要到libunity.so
里面寻找LoadIl2Cpp
函数。
📎 参考文章
- 作者:fei3ei
- 链接:https://www.fei3ei.xyz/p/il2cpp-study1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。