IL2CPPã·ãªãŒãºã®3çªç®ã®èšäºã§ã¯ãçæãããC ++ã³ãŒãã®ãããã°ã«é¢ããæçšãªãã³ãã«ã€ããŠèª¬æããŸãããã¬ãŒã¯ãã€ã³ãã®èšå®æ¹æ³ãæååãšãŠãŒã¶ãŒã¿ã€ãã®å
容ã®è¡šç€ºæ¹æ³ãäŸå€ã®çºçå Žæã®ç¹å®æ¹æ³ã§ãã
.NET ILã³ãŒãã ãããçæãããC ++ã³ãŒãã®ãããã°ã¯æ¥œããäœæ¥ã§ã¯ãªãããšã«æ³šæããŠãã ããã ããã§ãã以äžã®ãã³ãã¯ãUnityãããžã§ã¯ãã³ãŒããã¿ãŒã²ããããã€ã¹ã§ã©ã®ããã«å®è¡ãããããç解ããã®ã«åœ¹ç«ã¡ãŸãïŒèšäºã®æåŸã§ããããŒãžã³ãŒãã®ãããã°ã«ã€ããŠãå°ãã話ããŸãïŒã
ãããžã§ã¯ãã§çæãããã³ãŒããããã«è¡šç€ºãããŠãããã®ãšç°ãªãå¯èœæ§ãããããšã«æ³šæããŠãã ããã Unityã®åæ°ããŒãžã§ã³ã§ã¯ãçæãããã³ãŒããæé©åããããã«ã³ã³ãã¯ãã§çç£æ§ã®é«ããã®ã«ããããåªããŠããŸãã
ä»äºã®æºåãã®èšäºã§ã¯ãOSXã§UnityããŒãžã§ã³5.0.1p3ã䜿çšããŸãã äŸãšããŠã
åã®èšäºã®ãããžã§ã¯ã
ãåãäžããŸãããä»åã¯ãIL2CPPã¹ã¯ãªãããšã³ãžã³ã䜿çšããŠãã¿ãŒã²ããiOSãã©ãããã©ãŒã çšã«ãããžã§ã¯ããçµã¿ç«ãŠãŸãã åã®èšäºã®ããã«ãil2cpp.exeãILã³ãŒãã®ååã«åºã¥ããŠC ++ã³ãŒãã®ã¿ã€ããšã¡ãœããã®ååãçæããããã«ãDevelopment Playerãªãã·ã§ã³ããªã³ã«ããŸããã
Unityããããžã§ã¯ããçæããããXcodeã§ãããéãïŒããŒãžã§ã³6.3.1ãã€ã³ã¹ããŒã«ããŸããããå¥ã®çŸåšã®ããŒãžã§ã³ã§ãã€ã³ã¹ããŒã«ã§ããŸãïŒãã¿ãŒã²ããããã€ã¹ïŒiPad Mini 3ãŸãã¯ä»»æã®iOSããã€ã¹ïŒãéžæããŠãã«ãã§ããŸãã
ãã¬ãŒã¯ãã€ã³ããããžã§ã¯ããéå§ããåã«ãHelloWorldã¯ã©ã¹ã®Startã¡ãœããã®å
é ã«ãã¬ãŒã¯ãã€ã³ããé
眮ããŸãã åã®èšäºã§ãããããã«ããã®ã¡ãœããã¯ãçæãããC ++ã³ãŒãã§ã¯HelloWorld_Start_m3ãšåŒã°ããŸãã Cmd + Shift + OãæŒããšãXcodeã§ã¡ãœãããèŠã€ããããã«ã¡ãœããã®ååãå
¥åãå§ããããã«ãã¬ãŒã¯ãã€ã³ããèšå®ããŸãã

[ãããã°]> [ãã¬ãŒã¯ãã€ã³ã]> [ã·ã³ãã«ãã¬ãŒã¯ãã€ã³ãã®äœæ]ïŒ[ãããã°]> [ãã¬ãŒã¯ãã€ã³ã]> [ãã£ã©ã¯ã¿ãŒãã¬ãŒã¯ãã€ã³ãã®äœæ]ïŒãéžæããããšã§ãåãããšãã§ããŸãã

ããŠãXcodeãããžã§ã¯ããéå§ãããšãã¡ãœããã®æåã®éšåã§äžæãããŸãã
åæ§ã«ãååãããã£ãŠããå Žåã¯ãçæãããã³ãŒãã®ä»ã®ã¡ãœããã«ãã¬ãŒã¯ãã€ã³ããèšå®ã§ããŸãã ããã«ãXcodeã§ã¯ããã¡ã€ã«ã®è¡ã«ãã¬ãŒã¯ãã€ã³ããçŽæ¥èšå®ã§ããŸãã çæããããã¡ã€ã«ã¯ãã¹ãŠXcodeãããžã§ã¯ãã«ãããŸãããããè¡ãã«ã¯ããããžã§ã¯ãããã²ãŒã¿ãŒã®Classes / Nativeãã£ã¬ã¯ããªã«ç§»åããŸãã
è¡ãã¥ãŒXcodeã§IL2CPPæååè¡šçŸã衚瀺ããã«ã¯2ã€ã®æ¹æ³ããããŸãïŒçŽæ¥ãŸãã¯libil2cppã®ãŠãŒãã£ãªãã£ã䜿çšããŠãXcodeã§è¡šç€ºããããã«æååãstd :: stringãªããžã§ã¯ãã«å€æããŸãã _stringLiteral1ãšããæååã®å€ãèŠãŠã¿ãŸãããã
Ctagsãã«ãã€ã³ãŠãŒãã£ãªãã£ïŒãŸãã¯Xcodeã®Cmd + Ctrl + Jã³ãã³ãïŒã䜿çšããŠãã¿ã€ãIl2CppString_14ã®_stringLiteral1ã®å®çŸ©ã«é²ãããšãã§ããŸãã
struct Il2CppString_14 { Il2CppDataSegmentString header; int32_t length; uint16_t chars[15]; };
IL2CPPã®ã»ãŒãã¹ãŠã®è¡ã«ãã®è¡šçŸããããŸãã Il2CppStringã®å®çŸ©ã¯ãããããŒãã¡ã€ã«object-internals.hã«ãããŸãã æåã«ãIL2CPPã®ç®¡ç察象ã¿ã€ãã®æšæºããããŒ-Il2CppObjectïŒtypedef宣èšIl2CppDataSegmentStringã«ãã£ãŠã¢ã¯ã»ã¹ïŒã次ã«4ãã€ãã®æååé·ãšUTF-16圢åŒã®2ãã€ãæåã®é
åããããŸãã ã³ã³ãã€ã«äžã«å®çŸ©ããã_stringLiteral1ãªã©ã®è¡ã¯ãåºå®é·ã®æåã®é
åãååŸããå®è¡æã«çæãããè¡ã¯éžæãããé
åãååŸããŸãã
_stringLiteral1ã[ãŠã©ãã]ãŠã£ã³ããŠã«è¿œå ãã[_ stringLiteral1ã®ã¡ã¢ãªã®è¡šç€º]ãªãã·ã§ã³ãéžæããŠãã¡ã¢ãªå
ã®è¡ã®è¡šç€ºã確èªããŸãã

Memory Viewerã«è¡šç€ºããããã®ã¯æ¬¡ã®ãšããã§ãã

è¡ããããŒã«ã¯16ãã€ããå¿
èŠã§ãã 0x000EïŒ14ïŒã®å€ãæã€è¡ãµã€ãºã®å Žåã4ãã€ããç¶ããŸãã ãããã®æ¬¡ã®ãã€ãã¯ãæååã®æåã®æåã0x0048ïŒHïŒã§ãã çè«çã«ã¯ã1æåã¯2ãã€ããå æããŸããããã®è¡ã®åæåã¯ãã€ãåäœã§é
眮ããããããå³åŽã®ãã¥ãŒã§ã¯ãããã§åºåãããŠããŸãã ãã ãããã¹ãŠãéåžžã«èªã¿ãããã§ãã ãã®æ¹æ³ã¯ç¢ºãã«æ©èœããŸãããé·ãæååã«ã¯ããŸãé©ããŠããŸããã
Xcodeã®lldbãããã¬ãŒã䜿çšããŠãæååã®å
容ã衚瀺ããããšãã§ããŸãã utils / StringUtils.hããããŒã¯ãlibil2cppã®æçšãªãŠãŒãã£ãªãã£ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã ããšãã°ãlldbã³ãã³ãã©ã€ã³ããUtf16ToUtf8ã¡ãœãããåŒã³åºããŸãããã ã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
static std::string Utf16ToUtf8 (const uint16_t* utf16String);
C ++æ§é äœã®charsèŠçŽ ããã®ã¡ãœããã«æž¡ããšãUTF-8圢åŒã®std :: stringãªããžã§ã¯ããšããŠè¿ãããŸãã ãã®å Žåãlldbããã³ããã§pã³ãã³ãã䜿çšããŠãæååã®å
容ãå°å·ã§ããŸãã
(lldb) p il2cpp::utils::StringUtils::Utf16ToUtf8(_stringLiteral1.chars) (std::__1::string) $1 = "Hello, IL2CPP!"
ã«ã¹ã¿ã ã¿ã€ãã衚瀺ããããã«ãã«ã¹ã¿ã ã¿ã€ãã®ã³ã³ãã³ãã衚瀺ã§ããŸãã ãã®ãããžã§ã¯ãçšã«äœæããç°¡åãªã¹ã¯ãªããã«ã¯ãImportantãšããååã®CïŒåãšInstanceIdentifierãã£ãŒã«ãããããŸãã ãã®ã¿ã€ãã®2çªç®ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããçŽåŸã«ãã¬ãŒã¯ãã€ã³ããèšå®ãããšãçæãããã³ãŒãã®InstanceIdentifierãã£ãŒã«ãã®å€ãèªç¶ã«1ã«ãªãããšãããããŸãã

ãããã£ãŠãçæãããã³ãŒãã®ãŠãŒã¶ãŒå®çŸ©åã®å
容ã¯ãXcodeã®C ++ã³ãŒããšãŸã£ããåãæ¹æ³ã§è¡šç€ºã§ããŸãã
äŸå€çºçæã®ã³ãŒãå®è¡ã®äžæçæãããã³ãŒãããããã°ããŠãšã©ãŒã®åå ãçªãæ¢ããå¿
èŠããããããã»ãšãã©ã®å Žåãã¬ã€ãä»ãäŸå€ãé¢ä¿ããŠããŸãã å
ã»ã©èšã£ãããã«ãIL ++ã¯C ++äŸå€ã䜿çšããŠããããŒãžäŸå€ãå®è£
ããŸãã Xcodeã§ãã®ç¶æ³ã§ã³ãŒãã®å®è¡ãäžæããæ¹æ³ã¯ããã€ããããŸãã
æãç°¡åãªã®ã¯ã管ç察象äŸå€ãã¹ããŒããããã³ã«il2cpp.exeã䜿çšããil2cpp_codegen_raise_exceptioné¢æ°ã«ãã¬ãŒã¯ãã€ã³ããèšå®ããããšã§ãã

ãã®åŸããããžã§ã¯ãã®å®è¡ãèš±å¯ãããšãXcodeã¯Startã¡ãœããã³ãŒããInvalidOperationExceptionãã¹ããŒãããšãã«ãããžã§ã¯ããåæ¢ããŸãã ãã®å Žåãæååã®å
容ã衚瀺ãããšéåžžã«äŸ¿å©ã§ãã ããšãã°ãexåŒæ°ã§ã¯ãäŸå€ã¡ãã»ãŒãžã®ããè¡ãæã___message_2èŠçŽ ã«æ³šç®ã§ããŸãã

äžèšã®æé ã䜿çšãããšããã®è¡ã®å
容ãå°å·ããŠåé¡ã®åå ãèŠã€ããããšãã§ããŸãã
(lldb) p il2cpp::utils::StringUtils::Utf16ToUtf8(&ex->___message_2->___start_char_1) (std::__1::string) $88 = "Don't panic"
ãã®è¡ã¯äžã«ç€ºãããã®ãšéåžžã«äŒŒãŠããŸãããçæããããã£ãŒã«ãã®ååã¯ãããã«ç°ãªãããšã«æ³šæããŠãã ããã charsãã£ãŒã«ãã¯___start_char_1ãšåŒã°ããuint16_t []ã§ã¯ãªããuint16_tåã§ãã ãã ããããã¯äŸç¶ãšããŠé
åã®æåã®æåã§ããããã®ã¢ãã¬ã¹ãå€æé¢æ°ã«æž¡ãããšãã§ããŸãã
ãã ããçæãããã³ãŒãã¯ãã¹ãŠã®ãããŒãžäŸå€ãã¹ããŒããŸããã libil2cppã©ã³ã¿ã€ã ã³ãŒãã¯ãäžéšã®å Žåã«ã®ã¿ãããè¡ããŸãããããã§ãil2cpp_codegen_raise_exceptioné¢æ°ãåŒã³åºãããšã¯ãããŸããã ããããååããæ¹æ³ã¯ïŒ
äŸå€ãã¬ãŒã¯ãã€ã³ãïŒ[ãããã°]> [ãã¬ãŒã¯ãã€ã³ã]> [äŸå€ãã¬ãŒã¯ãã€ã³ãã®äœæ]ïŒãäœæãããšããã©ã¡ãŒã¿ãŒã§C ++äŸå€ãéžæã§ãããããã¿ã€ãIl2CppExceptionWrapperã®äŸå€ãã¹ããŒããããšãã«ã³ãŒãå®è¡ãäžæãããŸãã ãããã£ãŠããã¹ãŠã®ãããŒãžäŸå€ã¯C ++åã§ã©ãããããŠããããããã£ããã§ããŸãã

ãããã©ã®ããã«æ©èœãããããã¹ãããã«ã¯ãStartã¡ãœããã®å
é ã«æ¬¡ã®2è¡ãè¿œå ããŸãã
Important boom = null; Debug.Log(boom.InstanceIdentifier);
2è¡ç®ã¯NullReferenceExceptionãã¹ããŒããŸãã Xcodeã§ãã®ã³ãŒããå®è¡ãããšïŒä»¥åã«äŸå€ã®ãã¬ãŒã¯ãã€ã³ããèšå®ãããŠããããïŒãäŸå€ãã¹ããŒããããšãã«å®è¡ãå®éã«äžæãããããšãããããŸãã ãã ãããã¬ãŒã¯ãã€ã³ãã¯libil2cppã³ãŒãå
ã«ãããããã¢ã»ã³ãã©ã³ãŒãã®ã¿ã衚瀺ãããŸãã åŒã³åºãã¹ã¿ãã¯ã§ã¯ãil2cpp.exeã«ãã£ãŠå®è£
ãããNullCheckã¡ãœããã«ããã€ãã®ãã¬ãŒã ã移åããå¿
èŠããããŸãã

ãã®æç¹ã§ã1ã€ã®ãã¬ãŒã ã«æ»ã£ãŠãImportantåã®ã€ã³ã¹ã¿ã³ã¹ãå®éã«NULLã§ããããšãããããŸãã
ãããã«ãããã®ãã³ãããIL2CPPã«ãã£ãŠçæãããC ++ã³ãŒãã§çºçããåé¡ã远跡ããæ¹æ³ãç解ããã®ã«åœ¹ç«ãŠã°å¹žãã§ãã ãã®ãããªãããã°ãããããç解ããããã«ãIL2CPPã§äœ¿çšãããä»ã®ã¿ã€ãã詳ãã調ã¹ãããšããå§ãããŸãã
ãããŒãžã³ãŒããããã¬ãŒã«ã€ããŠã¯ã©ãã§ããããã ããã€ã¹ã§IL2CPPãããŒãžã³ãŒãããããã°ã§ããããšã¯æ¬åœã«çŽ æŽãããããšã§ãã
ãããŠãIL2CPPçšã®çµã¿èŸŒã¿ãããã¬ãŒã®ã¢ã«ãã¡çãæ¢ã«ãããŸãã åŒãç¶ãäœæ¥ãè¡ã£ãŠããŸãã®ã§ããæåŸ
ãã ããã
ãã®ã·ãªãŒãºã®æ¬¡åã®èšäºã§ã¯ãIL2CPPã§ã¡ãœããåŒã³åºããå®è£
ããããã€ãã®æ¹æ³ãæ€èšããããã©ãŒãã³ã¹ã®èŠ³ç¹ããããããæ¯èŒããŸãã