
*èšäºã®æåŸã«ããã©ã€ãã©ãªãžã®ãªã³ã¯ã ãã®èšäºèªäœã¯ãã©ã€ãã©ãªã«å®è£
ãããŠããã¡ã«ããºã ã®æŠèŠãäžçšåºŠã®è©³çްã§èª¬æããŠããŸãã macOSã®å®è£
ã¯ãŸã å®äºããŠããŸããããLinuxã®å®è£
ãšå€§å·®ã¯ãããŸããã ããã¯äž»ã«Linuxã®å®è£
ã§ãã
åææ¥ã®ååŸãgithubãæ©ãåã£ãŠãWindowsçšã®C ++ã³ãŒãã®æŽæ°ããã®å Žã§å®è£
ããã©ã€ãã©ãªã«åºäŒããŸããã ç§èªèº«ã¯æ°å¹Žåã«çªããéããŠãå°ãåŸæããŸããã§ããããããŠä»ããã¹ãŠã®ããã°ã©ãã³ã°ã¯LinuxïŒèªå®
ïŒãŸãã¯macOSïŒè·å ŽïŒã§è¡ãããŠããŸãã å°ãã°ãŒã°ã«ã§ãäžèšã®ã©ã€ãã©ãªããã®ã¢ãããŒããéåžžã«äººæ°ããããmsvcã¯Visual Studioã®ãç·šéããŠç¶è¡ãæ©èœã«åããã¯ããã¯ã䜿çšããããšãçºèŠããŸããã å¯äžã®åé¡ã¯ãéãŠã£ã³ããŠã®äžã«å®è£
ãèŠã€ãããªãã£ãããšã§ãïŒèŠãç®ãæªãã®ã§ããïŒïŒã äžèšã®ã©ã€ãã©ãªã®äœæè
ãä»ã®ãã©ãããã©ãŒã çšã®ç§»æ€çãäœæãããã©ããã«ã€ããŠã®è³ªåã«å¯Ÿããçãã¯ãããããã§ããã
æ¢åã®ãããžã§ã¯ãã³ãŒãã倿Žããå¿
èŠããªããªãã·ã§ã³ã«ã®ã¿èå³ããã£ãããšãããã«èšããªããã°ãªããŸãã ïŒããšãã°ã RCCPPãŸãã¯crã®å Žåããã¹ãŠã®æœåšçã«ãªããŒããããã³ãŒãã¯åçã«ããŒããããå¥åã®ã©ã€ãã©ãªãŒã«ããå¿
èŠããããŸãïŒã
ãã©ãããŠïŒã -ç§ã¯èããŠãç·éŠãå§ããŸããã
ãªãã§ïŒ
ç§ã¯äž»ã«gamedevãããŠããŸãã äœæ¥æéã®ã»ãšãã©ã¯ãã²ãŒã ããžãã¯ãšããžã¥ã¢ã«ã®ã¬ã€ã¢ãŠãã®äœæã«è²»ãããŠããŸãã ãã«ããŒãŠãŒãã£ãªãã£ã«ãimguiã䜿çšããŸãã ãæ³åã®ãšãããã³ãŒããæäœããç§ã®ãµã€ã¯ã«ã¯ããæžã蟌ã¿ã->ãã³ã³ãã€ã«ã->ãå®è¡ã->ãç¹°ãè¿ããã§ãã ãã¹ãŠãããªãè¿
éã«è¡ãããŸãïŒã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ããããããçš®é¡ã®ccacheãªã©ïŒã ããã§ã®åé¡ã¯ããã®ãµã€ã¯ã«ãååé »ç¹ã«ç¹°ãè¿ããªããã°ãªããªãããšã§ãã ããšãã°ãç§ã¯æ°ããã²ãŒã ã¡ã«ãã¯ã¹ãæžããŠããŸããæå¹ãªãå¶åŸ¡ããããžã£ã³ãã§ããããžã£ã³ãããšããŸãã
1.å¢ãã«åºã¥ããå®è£
æ¡ãæžããçµã¿ç«ãŠãç«ã¡äžããŸããã äžåºŠã§ã¯ãªãã誀ã£ãŠåãã¬ãŒã ã«ã€ã³ãã«ã¹ãé©çšããããšãããããŸããã
2.ä¿®æ£ãçµã¿ç«ãŠãèµ·åãæ£åžžã«ãªããŸããã ããããã€ã³ãã«ã¹ã®çµ¶å¯Ÿå€ãããã«ååŸããå¿
èŠããããŸãã
3.ä¿®æ£ãçµã¿ç«ãŠãèµ·åãåäœã ããããã©ããããããããã¯ééã£ãŠããããã«æããŸãã è¡ãã«ã¯åŒ·ãã«åºã¥ããŠè©Šãå¿
èŠããããŸãã
4.匷床ãçµã¿ç«ãŠãèµ·åãåäœã«åºã¥ããŠå€§ãŸããªå®è£
ãæžããŸããã ãžã£ã³ãæã«ç¬éé床ã倿Žããã ãã§ååã§ãã
...
10.ä¿®æ£ãçµã¿ç«ãŠãèµ·åãåäœã ãããããŸã ããã§ã¯ãããŸããã ããããgravityScale
倿Žã«åºã¥ããŠå®è£
ã詊ã¿ãå¿
èŠããããŸãã
...
20.ãããããããã§ããïŒ ããã§ãgamedizãtestãfillã®ãšãã£ã¿ãŒã§ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒãåãåºããŸãã
...
30.ãžã£ã³ãã®æºåãã§ããŸããã
ãããŠãåå埩ã§ã³ãŒããåéããå¿
èŠããããèµ·åãããã¢ããªã±ãŒã·ã§ã³ã§ç§ããžã£ã³ãã§ããå Žæã«å°éããŸãã éåžžãããã«ã¯å°ãªããšã10ç§ããããŸãã ãããŠãç§ã¯ãŸã å°éããå¿
èŠããããªãŒãã³ãšãªã¢ã§ã®ã¿ãžã£ã³ãããããšãã§ããŸããïŒ ãŸããNãŠãããã®é«ãã®ãããã¯ã«ãžã£ã³ãã§ããããã«ããå¿
èŠãããå Žåã¯ã©ããªããŸããïŒ ããã§ã¯ããããã°ããå¿
èŠããããæéãè²»ããå¿
èŠããããã¹ãã·ãŒã³ãåéããå¿
èŠããããŸãã ãã®ãããªå埩ã®ããã«ãã³ãŒãã®ããããªããŒããçæ³çã§ãã ãã¡ãããããã¯äžèœè¬ã§ã¯ãªãããã¹ãŠã«é©ããŠããããã§ã¯ãããŸããããŸããåèµ·ååŸã§ããã²ãŒã ã®äžçã®äžéšãåçŸããå¿
èŠãããå Žåãããããããèæ
®ããå¿
èŠããããŸãã ããããå€ãã®å Žåãããã¯æçšã§ãããæ³šæãšå€ãã®æéãç¯çŽã§ããŸãã
åé¡ã®èŠä»¶ãšèª¬æ
- ã³ãŒãã倿Žãããšãããã¹ãŠã®é¢æ°ã®æ°ããããŒãžã§ã³ã¯åã颿°ã®å€ãããŒãžã§ã³ã眮ãæããå¿
èŠããããŸã
- ããã¯Linuxããã³macOSã§åäœããã¯ãã§ãã
- æ¢åã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã倿Žããå¿
èŠã¯ãããŸããã
- çæ³çã«ã¯ãããã¯ããµãŒãããŒãã£ã®ãŠãŒãã£ãªãã£ã䜿çšããã«ãã¢ããªã±ãŒã·ã§ã³ã«éçãŸãã¯åçã«ãªã³ã¯ãããã©ã€ãã©ãªã§ãªããã°ãªããŸãã
- ãã®ã©ã€ãã©ãªã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãäžããªãããšãæãŸããã§ãã
- ãããcmake + make / ninjaã§åäœããå Žåã¯ååã§ã
- debazineãã«ãã§åäœããå Žåã¯ååã§ãïŒæé©åãªããæåã®ããªãã³ã°ãªããªã©ïŒ
ããã¯ãå®è£
ãæºãããªããã°ãªããªãèŠä»¶ã®æå°ã»ããã§ãã ããããå
ãããã«å®è£
ããããã®ãç°¡åã«èª¬æããŸãã
- éç倿°ã®å€ãæ°ããã³ãŒãã«è»¢éããïŒãããéèŠã§ããçç±ã«ã€ããŠã¯ããéç倿°ã®è»¢éãã»ã¯ã·ã§ã³ãåç
§ããŠãã ããïŒ
- äŸåé¢ä¿ã«åºã¥ãããªããŒãïŒããããŒã®å€æŽ->åæ§ç¯
ãããžã§ã¯ãã®åå ãã¹ãŠã®äŸåãã¡ã€ã«ïŒ - åçã©ã€ãã©ãªããã³ãŒãããªããŒããã
å®è£
ãã®ç¬éãŸã§ãç§ã¯å¯Ÿè±¡é åããéåžžã«é¢ããŠããã®ã§ãæ
å ±ããŒãããåéããŠååããå¿
èŠããããŸããã
é«ã¬ãã«ã§ã¯ãã¡ã«ããºã ã¯æ¬¡ã®ããã«ãªããŸãã
- ãœãŒã¹ã®å€æŽã«ã€ããŠãã¡ã€ã«ã·ã¹ãã ãç£èŠããŸã
- ãœãŒã¹ã倿Žããããšãã©ã€ãã©ãªã¯ããã®ãã¡ã€ã«ãæ¢ã«ã³ã³ãã€ã«ãããŠããã³ã³ãã€ã«ã³ãã³ãã䜿çšããŠãããåæ§ç¯ããŸã
- åéããããã¹ãŠã®ãªããžã§ã¯ãã¯ãåçã«ããŒããããã©ã€ãã©ãªã«ãªã³ã¯ãããŸã
- ã©ã€ãã©ãªã¯ããã»ã¹ã®ã¢ãã¬ã¹ç©ºéã«ããŒããããŸã
- ã©ã€ãã©ãªã®ãã¹ãŠã®é¢æ°ã¯ãã¢ããªã±ãŒã·ã§ã³ã®åã颿°ã眮ãæããŸãã
- éç倿°ã®å€ã¯ãã¢ããªã±ãŒã·ã§ã³ããã©ã€ãã©ãªã«è»¢éãããŸã
æãè峿·±ããã®ããå§ããŸããã-颿°ãªããŒãæ©æ§ã
ãªããŒãæ©èœ
ã©ã³ã¿ã€ã ã§ïŒãŸãã¯ã»ãŒïŒå®è¡äžã®é¢æ°ã眮ãæããããã®3ã€ã®å€ããå°ãªãã人æ°ã®ããæ¹æ³ã以äžã«ç€ºããŸãã
- LD_PRELOADã䜿çšããããªã㯠-ããšãã°ã
strcpy
颿°ã䜿çšããŠåçã«ããŒããããã©ã€ãã©ãªãæ§ç¯ããã¢ããªã±ãŒã·ã§ã³ã®èµ·åæã«ã©ã€ãã©ãªã§ã¯ãªãstrcpy
ããŒãžã§ã³ãstrcpy
ããã«ããŸãã - PLTããã³GOTããŒãã«ã®å€æŽ-ãšã¯ã¹ããŒãããã颿°ãããªãŒããŒããŒããã§ããŸã
- 颿°ãã㯠-å®è¡ã¹ã¬ããããã颿°ããå¥ã®é¢æ°ã«ãªãã€ã¬ã¯ãã§ããŸã
æåã®2ã€ã®ãªãã·ã§ã³ã¯ããšã¯ã¹ããŒãããã颿°ã§ã®ã¿æ©èœãããããæããã«é©åã§ã¯ãããŸããããŸããã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®é¢æ°ã屿§ã§ããŒã¯ããããªãããã§ãã ãããã£ãŠã颿°ããã¯ã¯ç§ãã¡ã®ãªãã·ã§ã³ã§ãïŒ
èŠããã«ãããã¯ã¯æ¬¡ã®ããã«æ©èœããŸãã
- 颿°ã¢ãã¬ã¹ãèŠã€ãããŸãã
- 颿°ã®æåã®æ°ãã€ãã¯ãå¥ã®é¢æ°ã®æ¬äœãžã®ç¡æ¡ä»¶ã®é·ç§»ã«ãã£ãŠäžæžããããŸã
- ...
- å©çïŒ
msvcã«ã¯ããã®ããã®2ã€ã®ãã©ã°ããããŸã- /hotpatch
ãš/FUNCTIONPADMIN
ã å颿°ã®å
é ã«ããæåã®ãã®ã¯2ãã€ããæžã蟌ã¿ãŸããããã·ã§ãŒããžã£ã³ããã䜿çšããŠåŸç¶ã®æžãæããè¡ãå Žåã¯äœãè¡ããŸããã 2çªç®ã®æ¹æ³ã§ã¯ãå颿°ã®æ¬äœã®åã«ç©ºã®ã¹ããŒã¹ãnop
åœä»€ã®åœ¢åŒã§æ®ããŠãç®çã®å Žæãžã®ããã³ã°ãžã£ã³ãããè¡ãããšãã§ããŸãã ãããWindowsããã³msvcã§ã©ã®ããã«å®è£
ãããŠãããã«ã€ããŠã¯ãããšãã°ãã¡ããã芧ãã ãã ã
æ®å¿µãªãããclangãšgccïŒå°ãªããšãLinuxãšmacOSã§ã¯ïŒã«äŒŒããã®ã¯ãããŸããã å®éãããã¯ããã»ã©å€§ããªåé¡ã§ã¯ãããŸãããå€ã颿°ã®äžã«çŽæ¥èšè¿°ããŸãã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ããã«ãã¹ã¬ããåãããŠãããšããã©ãã«ãçºçããå±éºããããŸãã éåžžãã«ãã¹ã¬ããç°å¢ã§ãããã¹ã¬ããã«ããããŒã¿ãžã®ã¢ã¯ã»ã¹ãå¶éããå¥ã®ã¹ã¬ããããããã®ããŒã¿ã倿Žããå Žåãå¥ã®ã¹ã¬ããããã®ã³ãŒãã倿Žããéãããã¹ã¬ããã«ããã³ãŒãã®å®è¡èœåãå¶éããå¿
èŠããããŸãã ç§ã¯ãããè¡ãæ¹æ³ãçè§£ããŠããŸããã§ããã®ã§ãå®è£
ã¯ãã«ãã¹ã¬ããç°å¢ã§äºæž¬ã§ããªãåäœãããŸãã
埮åŠãªç¹ã1ã€ãããŸãã 32ãããã·ã¹ãã ã§ã¯ã5ãã€ãã§ä»»æã®å Žæã«ããžã£ã³ããã§ããŸãã 64ãããã·ã¹ãã ã§ã¯ãã¬ãžã¹ã¿ãæãªãå¿
èŠããªãå Žåã14ãã€ããå¿
èŠã§ãã äžçªäžã®è¡ã¯ããã·ã³ã³ãŒãã®ã¹ã±ãŒã«ã§14ãã€ããéåžžã«å€ããã³ãŒãã«ç©ºã®æ¬äœãæã€ã¹ã¿ã颿°ãããå Žåãã»ãšãã©ã®å Žåãé·ãã14ãã€ãæªæºã§ãã å®å
šãªçå®ã¯ããããŸããããã³ãŒããèããèšè¿°ãããããã°ããŠããéãéã¢ã»ã³ãã©ãŒã®èåŸã«ãã°ããæéãè²»ãããŸããã ããã¯ã2ã€ã®é¢æ°ã®éå§ã®éã«å°ãªããšã16ãã€ãããããšãæå³ããŸããããã¯ãããããããžã£ã ãããã®ã«ååã§ãã ããã§ã¯è¡šé¢çãªã°ãŒã°ã«ãäž»å°ããŸããã ã確ãã«ããããŸããã幞éã ã£ãã®ãã仿¥ã§ã¯ãã¹ãŠã®ã³ã³ãã€ã©ããããè¡ããŸãã ãããã«ãããçãããå Žåã¯ãã¹ã¿ã颿°ãåå倧ãããªãããã«ãã¹ã¿ã颿°ã®å
é ã§ããã€ãã®å€æ°ã宣èšããã ãã§ãã
ãããã£ãŠãæåã®ã°ã¬ã€ã³ãã€ãŸããå€ãããŒãžã§ã³ããæ°ããããŒãžã§ã³ã«é¢æ°ããªãã€ã¬ã¯ãããã¡ã«ããºã ããããŸãã
ã³ããŒãããããã°ã©ã ã®æ©èœãæ€çŽ¢ãã
ããã§ãããã°ã©ã ãŸãã¯ä»»æã®åçã©ã€ãã©ãªããäœããã®æ¹æ³ã§ïŒãšã¯ã¹ããŒãã ãã§ãªãïŒãã¹ãŠã®é¢æ°ã®ã¢ãã¬ã¹ãååŸããå¿
èŠããããŸãã ããã¯ãã¢ããªã±ãŒã·ã§ã³ããæåãåãåãããªãå Žåãã·ã¹ãã APIã䜿çšããŠéåžžã«ç°¡åã«å®è¡ã§ããŸãã Linuxã§ã¯ããããã¯elf.h
ããã³link.h
apiãmacOSã§ã¯loader.h
ããã³nlist.h
ã§ãã
dl_iterate_phdr
ã䜿çšããŠãããŒãããããã¹ãŠã®ã©ã€ãã©ãªãšãå®éã«ã¯ããã°ã©ã ãdl_iterate_phdr
ãŸãã- ã©ã€ãã©ãªãããŒããããŠããã¢ãã¬ã¹ãèŠã€ãã
.symtab
ã»ã¯ã·ã§ã³ãããæåã«é¢ãããã¹ãŠã®æ
å ±ãã€ãŸãååãã¿ã€ããã»ã¯ã·ã§ã³ãååšããã»ã¯ã·ã§ã³ã®ã€ã³ããã¯ã¹ããµã€ãºãååŸããä»®æ³ã¢ãã¬ã¹ãšã©ã€ãã©ãªããŒãã¢ãã¬ã¹ã«åºã¥ããŠãå®éã®ãã¢ãã¬ã¹ãèšç®ããŸã
埮åŠãªç¹ã1ã€ãããŸãã elfãã¡ã€ã«ãããŒããããšããã·ã¹ãã ã¯.symtab
ã»ã¯ã·ã§ã³ãããŒãããïŒééã£ãŠããå Žåã¯æ£ããïŒ .dynsym
ã»ã¯ã·ã§ã³ã¯ç§ãã¡ã«é©åããŸãããå¯èŠæ§STV_INTERNAL
ããã³STV_HIDDEN
æåãæœåºã§ããªãSTV_HIDDEN
ã§ãã ç°¡åã«èšãã°ããã®ãããªé¢æ°ã¯è¡šç€ºãããŸããã
ãããŠãã®ãããªå€æ°ïŒ
ãããã£ãŠããã©ã°ã©ã3ã§ã¯ã dl_iterate_phdr
ããæäŸãããããã°ã©ã ã§ã¯ãªãããã£ã¹ã¯ããããŠã³ããŒããããšã«ãããŒãµãŒïŒãŸãã¯ãã¢APIïŒã§dl_iterate_phdr
ãããã¡ã€ã«ã䜿çšããŠããŸãã ã ããç§ãã¡ã¯äœãèŠéããŸããã macOSã§ã¯ãæé ã¯äŒŒãŠããŸãããã·ã¹ãã APIã®é¢æ°åã®ã¿ãç°ãªããŸãã
ãã®åŸããã¹ãŠã®æåããã£ã«ã¿ãªã³ã°ããŠã次ã®ãã®ã®ã¿ãä¿åããŸãã
- åããŒãã§ãã颿°ã¯ã
.text
ã»ã¯ã·ã§ã³ã«ããSTT_FUNC
ã¿ã€ãã®æåã§ããµã€ãºã¯ãŒãã§ã¯ãããŸããã ãã®ãããªãã£ã«ã¿ãŒã¯ãã³ãŒããå®éã«ãã®ããã°ã©ã ãŸãã¯ã©ã€ãã©ãªã«å«ãŸããŠãã颿°ã®ã¿ãã¹ãããããŸã - å€ã転éããéç倿°ã¯ã
.bss
ã»ã¯ã·ã§ã³ã«ããã¿ã€ãSTT_OBJECT
æåã§ã
æŸéãŠããã
ã³ãŒãããªããŒãããã«ã¯ãã©ããããœãŒã¹ã³ãŒããã¡ã€ã«ãååŸããã©ã®ããã«ã³ã³ãã€ã«ããããç¥ãå¿
èŠããããŸãã
æåã®å®è£
ã§ã¯ãDWARF圢åŒã®ãããã°æ
å ±ãå«ã.debug_info
ã»ã¯ã·ã§ã³ãããã®æ
å ±ãèªã¿åããŸããã ãã®ETã®ã³ã³ãã€ã«è¡ãååŸããããã«ãDWARFå
ã®åã³ã³ãã€ã«åäœïŒETïŒã«å¯ŸããŠãã³ã³ãã€ã«äžã«-grecord-gcc-switches
æž¡ãå¿
èŠããããŸãã DWARFèªäœãlibelfã«ãã³ãã«ãããŠããlibdwarfã©ã€ãã©ãªãè§£æãlibelf
ã DWARFããã®ã³ã³ãã€ã«ã³ãã³ãã«å ããŠãä»ã®ãã¡ã€ã«ã«å¯ŸããETã®äŸåé¢ä¿ã«é¢ããæ
å ±ãååŸã§ããŸãã ããããããã€ãã®çç±ã§ãã®å®è£
ãæåŠããŸããã
- 峿žé€šã¯ããªãéã
- ãETããã³ã³ãã€ã«ãããDWARFã¢ããªã±ãŒã·ã§ã³ã®è§£æãäŸåé¢ä¿ã®è§£æã§ã¯ã10ç§åŒ·ããããŸãã
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããã®ã«10ç§ããããããŸãã å°ãèããŠãããDWARFã®è§£æããžãã¯ãcompile_commands.json
è§£æã«æžãçŽããŸããã ãã®ãã¡ã€ã«ã¯ãCMakeLists.txtã«set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
ã远å ããã ãã§çæã§ããŸãã ãããã£ãŠãå¿
èŠãªãã¹ãŠã®æ
å ±ãååŸããŸãã
äŸåé¢ä¿ã®åŠç
DWARFãæŸæ£ããããããã¡ã€ã«éã®äŸåé¢ä¿ãåŠçããå¥ã®ãªãã·ã§ã³ãèŠã€ããå¿
èŠããããŸãã ç§ã¯å®éã«èªåã®æã§ãã¡ã€ã«ãè§£æãããããã«include
ãæ¢ããããããŸããã§ããããã³ã³ãã€ã©èªäœãããäŸåé¢ä¿ã«ã€ããŠç¥ã£ãŠãã人ã¯ããŸããïŒ
clangããã³gccã«ã¯ãããããdepfileãã»ãŒç¡æã§çæããå€ãã®ãªãã·ã§ã³ããããŸãã ãããã®ãã¡ã€ã«ã¯ãmakeããã³ninjaãã«ãã·ã¹ãã ã䜿çšããŠããã¡ã€ã«éã®äŸåé¢ä¿ã解決ããŸãã Depfileã®åœ¢åŒã¯éåžžã«åçŽã§ãã
CMakeFiles/lib_efsw.dir/libs/efsw/src/efsw/DirectorySnapshot.cpp.o: \ /home/ddovod/_private/_projects/jet/live/libs/efsw/src/efsw/base.hpp \ /home/ddovod/_private/_projects/jet/live/libs/efsw/src/efsw/sophist.h \ /home/ddovod/_private/_projects/jet/live/libs/efsw/include/efsw/efsw.hpp \ /usr/bin/../lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/string \ /usr/bin/../lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/x86_64-linux-gnu/c++/7.3.0/bits/c++config.h \ /usr/bin/../lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/x86_64-linux-gnu/c++/7.3.0/bits/os_defines.h \ ...
ã³ã³ãã€ã©ã¯ãããã®ãã¡ã€ã«ãåETã®ãªããžã§ã¯ããã¡ã€ã«ã®é£ã«é
眮ããŸããããããè§£æããŠããã·ã¥ãããã«å
¥ããã ãã§ãã åã500 ETã®compile_commands.json
+ depfilesã®åèšè§£æã«ã¯1ç§åŒ·ããããŸãã ãã¹ãŠãæ©èœããããã«ã¯ãã³ã³ãã€ã«ãªãã·ã§ã³ã§ãã¹ãŠã®ãããžã§ã¯ããã¡ã€ã«ã«å¯ŸããŠ-MD
ãã©ã°ãã°ããŒãã«ã«è¿œå ããå¿
èŠããããŸãã
å¿è
ã«é¢é£ãã埮åŠãªç¹ã1ã€ãããŸãã ãã®ãã«ãã·ã¹ãã ã¯ãããŒãºã®-MD
ãã©ã°ã«é¢ä¿ãªãã -MD
çæããŸãã ãã ããçæåŸããã€ããªåœ¢åŒã«å€æãããœãŒã¹ãã¡ã€ã«ãåé€ããŸãã ãããã£ãŠãninjaãèµ·åãããšãã¯ã -d keepdepfile
ãã©ã°ãæž¡ãå¿
èŠããããŸãã ãŸããç§ã«ã¯äžæãªçç±ã§ãmakeïŒ -MD
ãªãã·ã§ã³ã䜿çšïŒã®å Žåããã¡ã€ã«ã¯some_file.cpp.d
ãšåŒã°ããå¿è
ã§ã¯some_file.cpp.od
ãšåŒã°ãsome_file.cpp.od
ã ãããã£ãŠãäž¡æ¹ã®ããŒãžã§ã³ã確èªããå¿
èŠããããŸãã
éç倿°è»¢é
次ã®ãããªã³ãŒãããããšããŸãããïŒéåžžã«åæçãªäŸïŒïŒ
veryUsefulFunction
颿°ã次ã®ããã«å€æŽããŸãã
int veryUsefulFunction(int value) { return value * 3; }
veryUsefulFunction
ã«å ããŠãæ°ããã³ãŒãã§åçã©ã€ãã©ãªãåèµ·åãããšãéç倿°static Singleton ins;
ãããã³Singletor::instance
ã¡ãœããã ãã®çµæãããã°ã©ã ã¯äž¡æ¹ã®é¢æ°ã®æ°ããããŒãžã§ã³ã®åŒã³åºããéå§ããŸãã ãã ãããã®ã©ã€ãã©ãªã®éçins
ã¯ãŸã åæåãããŠããªããããæåã«ã¢ã¯ã»ã¹ãããšãã«ã Singleton
ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããŸãã 確ãã«ããã¯æãŸãããããŸããã ãããã£ãŠãå®è£
ã¯ãã¢ã»ã³ããªãããåçã©ã€ãã©ãªã§èŠã€ãã£ããã®ãããªãã¹ãŠã®å€æ°ã®å€ãã ã¬ãŒã倿°ãšãšãã«æ°ããã³ãŒããšãšãã«å€ãã³ãŒããããã®éåžžã«åçãªã©ã€ãã©ãªã«è»¢éããŸãã
埮åŠã§äžè¬çã«äžæº¶æ§ã®ç¬éããããŸãã
ã¯ã©ã¹ããããšããŸãïŒ
class SomeClass { public: void calledEachUpdate() { m_someVar1++; } private: int m_someVar1 = 0; };
calledEachUpdate
ã¡ãœããcalledEachUpdate
ã1ç§éã«60ååŒã³åºãããŸãã æ°ãããã£ãŒã«ãã远å ããŠå€æŽããŸãïŒ
class SomeClass { public: void calledEachUpdate() { m_someVar1++; m_someVar2++; } private: int m_someVar1 = 0; int m_someVar2 = 0; };
ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãåçã¡ã¢ãªãŸãã¯ã¹ã¿ãã¯äžã«ããå Žåãã³ãŒãããªããŒãããåŸãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããå¯èœæ§ããããŸãã å²ãåœãŠãããã€ã³ã¹ã¿ã³ã¹ã«ã¯å€æ°m_someVar1
ã®ã¿ãå«ãŸããŸãããåèµ·ååŸã calledEachUpdate
ã¡ãœããã¯m_someVar2
ã倿Žããããšããå®éã«ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã«å±ããªããã®ã倿Žããäºæž¬äžèœãªçµæãââãããããŸãã ãã®å Žåãç¶æ
転éããžãã¯ã¯ããã°ã©ããŒã«è»¢éãããŸããããã°ã©ããŒã¯äœããã®æ¹æ³ã§ãªããžã§ã¯ãã®ç¶æ
ãä¿åããã³ãŒãããªããŒãããåã«ãªããžã§ã¯ãèªäœãåé€ããåèµ·ååŸã«æ°ãããªããžã§ã¯ããäœæããå¿
èŠããããŸãã ã©ã€ãã©ãªã¯ãã¢ããªã±ãŒã·ã§ã³ãåŠçã§ããonCodePreLoad
ããã³onCodePostLoad
ããªã²ãŒãã¡ãœããã®åœ¢åŒã§ã€ãã³ããæäŸããŸãã
ãã®ç¶æ³ãäžè¬çãªæ¹æ³ã§è§£æ±ºããæ¹æ³ïŒããã³ãã®å¯èœæ§ïŒãããããŸããã ããã§ããã®ã±ãŒã¹ãã»ãŒæ£åžžãã¯éç倿°ã«å¯ŸããŠã®ã¿æ©èœããæ¬¡ã®ããžãã¯ã䜿çšããŸãã
void* oldVarPtr = ...; void* newVarPtr = ...; size_t oldVarSize = ...; size_t newVarSize = ...; memcpy(newVarPtr, oldVarPtr, std::min(oldVarSize, newVarSize));
ããã¯ããŸãæ£ç¢ºã§ã¯ãããŸããããç§ãæãã€ããã®ã¯æé«ã§ãã
ãã®çµæãã©ã³ã¿ã€ã ãããŒã¿æ§é å
ã®ãã£ãŒã«ãã®ã»ãããšã¬ã€ã¢ãŠãã倿Žããå Žåãã³ãŒãã¯äºæããªãåäœãããŸãã åãããšãå€çžåã«ãåœãŠã¯ãŸããŸãã
ãã¹ãŠããŸãšãã
ãã¹ãŠãã©ã®ããã«é£æºãããã
- ã©ã€ãã©ãªã¯ãããã»ã¹ã«åçã«ããŒãããããã¹ãŠã®ã©ã€ãã©ãªã®ããããŒãå埩åŠçããå®éã«ã¯ããã°ã©ã èªäœãæåãè§£æããã³ãã£ã«ã¿ãŒåŠçããŸãã
- 次ã«ãã©ã€ãã©ãªã¯ã¢ããªã±ãŒã·ã§ã³ãã£ã¬ã¯ããªãšèŠªãã£ã¬ã¯ããªã§
compile_commands.json
ãã¡ã€ã«ãååž°çã«èŠã€ããããšããããããETã«é¢ããå¿
èŠãªæ
å ±ããã¹ãŠåŒãåºããŸãã - ã©ã€ãã©ãªã¯ãªããžã§ã¯ããã¡ã€ã«ãžã®ãã¹ãç¥ã£ãŠãããããdepfilesãããŒãããŠè§£æããŸãã
- ãã®åŸãããã°ã©ã ãœãŒã¹ã³ãŒãã®ãã¹ãŠã®ãã¡ã€ã«ã®æãäžè¬çãªãã£ã¬ã¯ããªãèšç®ããããã®ãã£ã¬ã¯ããªã®ç£èŠãååž°çã«éå§ãããŸãã
- ãã¡ã€ã«ã倿Žããããšãã©ã€ãã©ãªã¯äŸåé¢ä¿ã®ããã·ã¥ãããã«ãããã©ããã確èªããããå Žåã
compile_commands.json
ã³ã³ãã€ã«ã³ãã³ãã䜿çšããŠã倿Žããããã¡ã€ã«ãšãã®äŸåé¢ä¿ã®ã³ã³ãã€ã«ããã»ã¹ãããã¯ã°ã©ãŠã³ãã§éå§ããŸãã - ããã°ã©ã ãã³ãŒãã®ãªããŒããèŠæ±ãããšïŒç§ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ã
Ctrl+r
ã®çµã¿åãããããã«å²ãåœãŠãããŸãïŒãã©ã€ãã©ãªã¯ã³ã³ãã€ã«ããã»ã¹ã®å®äºãåŸ
ã¡ããã¹ãŠã®æ°ãããªããžã§ã¯ããåçã©ã€ãã©ãªã«ãªã³ã¯ããŸãã - ãã®ã©ã€ãã©ãªã¯
dlopen
颿°dlopen
ããŠããã»ã¹ã®ã¢ãã¬ã¹ç©ºéã«ããŒããããŸãã - ã·ã³ãã«ã«é¢ããæ
å ±ã¯ãã®ã©ã€ãã©ãªããããŒãããããã®ã©ã€ãã©ãªããã®ã·ã³ãã«ã®ã»ãããšããã»ã¹ã«æ¢ã«ååšããã·ã³ãã«ã®äº€å·®éšåå
šäœããªããŒãïŒé¢æ°ã®å ŽåïŒãŸãã¯è»¢éïŒéç倿°ã®å ŽåïŒãããŸãã
ããã¯éåžžã«ããŸãæ©èœããŸããç¹ã«ãå°ãªããšãå
éšã§äœãäºæ³ãããäœãäºæ³ãããããç¥ã£ãŠããå Žåã¯ããã§ãã
å人çã«ã¯ãLinuxåãã®ãã®ãããªãœãªã¥ãŒã·ã§ã³ã®æ¬ åŠã«éåžžã«é©ããŸããããããã«æ¬åœã«èå³ããã人ã¯ããŸããïŒ
ã©ããªæ¹å€ãåãã§ããŸããããããšãïŒ
å®è£
ãžã®ãªã³ã¯