ã¯ããã«
æè¿ããã€ã¯ãã³ã³ãããŒã©ã«èå³ãæã¡ãŸããã æåã«AVRã次ã«ARMã ãã€ã¯ãã³ã³ãããŒã©ãŒã®ããã°ã©ãã³ã°ã«ã¯ãã¢ã»ã³ãã©ãŒãšCã®2ã€ã®äž»ãªãªãã·ã§ã³ããããŸããããããç§ã¯Fortããã°ã©ãã³ã°èšèªã®ãã¡ã³ã§ããããããã®ãã€ã¯ãã³ã³ãããŒã©ãŒãžã®ç§»æ€ãéå§ããŸããã ãã¡ãããæ¢æã®ãœãªã¥ãŒã·ã§ã³ã¯ãããŸãããç§ãæãã§ãããã®ã¯ãããŸããã§ãããgdbã䜿çšãããããã°ã§ãã ãããŠãç§ã¯ãã®ã®ã£ãããåããããã«åºçºããŸããïŒãããŸã§ã¯ARMã®ã¿ïŒã 32ãããARM Cortex-M3ããã»ããµã128kBãã©ãã·ã¥ãããã³8kB RAMãåããstm32vldiscoveryããŒãããããŸããã
ãã¡ãããFortã§ã¯ãã¹ç¿»èš³æ©ãäœæããŸãããããã®èšèªã¯ãšããŸããã¯ã§ãããšèããããŠãããããèšäºã«ã¯ã³ãŒãã¯ãããŸããã ããªã詳现ãªæšå¥šäºé ã«éå®ããŸãã ãã®ããŒãã«é¢ãããããã¯ãŒã¯äžã®ããã¥ã¡ã³ããšäŸã¯ã»ãšãã©ãããŸãããäžéšã®ãã©ã¡ãŒã¿ãŒã¯è©Šè¡é¯èª€ã«ãã£ãŠç§ãéžæããäžéšã¯gccã³ã³ãã€ã©ãŒã®åºåãã¡ã€ã«ãåæããŠéžæããŸããã ããã«ãå¿ èŠãªæå°éã®ãããã°æ å ±ã®ã¿ã䜿çšããŸãããããšãã°ãåé 眮ãä»ã®å€ãã®ãã®ã«ã¯è§ŠããŸããã§ããã ãããã¯ã¯éåžžã«åºç¯ã§ãããç§ã¯ãããç§ãåçœããç§ã¯ãããç§ã«ãšã£ãŠååã§ããããšãå€æããããã30ããŒã»ã³ããç解ããã
ãã®ãããžã§ã¯ãã«èå³ããã人ã¯èª°ã§ãããããã³ãŒããããŠã³ããŒãã§ããŸãã
ELFã¬ãã¥ãŒ
æšæºéçºããŒã«ã¯ãããã°ã©ã ãELFïŒå®è¡å¯èœããã³ãªã³ã¯å¯èœåœ¢åŒïŒãã¡ã€ã«ã«ã³ã³ãã€ã«ãããããã°æ å ±ãå«ããããšãã§ããŸãã ããã§åœ¢åŒä»æ§ãèŠã€ããããšãã§ããŸã ã ããã«ãåã¢ãŒããã¯ãã£ã«ã¯ãARMæ©èœãªã©ã®ç¬èªã®ç¹æ§ããããŸã ã ãã®åœ¢åŒã«ã€ããŠç°¡åã«èããŠã¿ãŸãããã
ELFå®è¡å¯èœãã¡ã€ã«ã¯ã次ã®éšåã§æ§æãããŠããŸãã
1.ã¿ã€ãã«ïŒELFããããŒïŒ
ãã¡ã€ã«ãšãã®äž»ãªç¹æ§ã«é¢ããäžè¬æ å ±ãå«ãŸããŠããŸãã
2.ããã°ã©ã ã®ã¿ã€ãã«ïŒããã°ã©ã ããããŒããŒãã«ïŒ
ããã¯ããã¡ã€ã«ã»ã¯ã·ã§ã³ãšã¡ã¢ãªã»ã°ã¡ã³ãéã®å¯Ÿå¿è¡šã§ãããããŒããŒã«åã»ã¯ã·ã§ã³ãæžã蟌ãã¡ã¢ãªé åãæ瀺ããŸãã
3.ã»ã¯ã·ã§ã³
ã»ã¯ã·ã§ã³ã«ã¯ããã¡ã€ã«å ã®ãã¹ãŠã®æ å ±ïŒããã°ã©ã ãããŒã¿ããããã°æ å ±ãªã©ïŒãå«ãŸããŸãã
åã»ã¯ã·ã§ã³ã«ã¯ãã¿ã€ããååãããã³ãã®ä»ã®ãã©ã¡ãŒã¿ãŒããããŸãã ã.textãã»ã¯ã·ã§ã³ã§ã¯ãéåžžãã³ãŒãã¯ã.symtabã-ããã°ã©ã ã·ã³ãã«ïŒãã¡ã€ã«åãããã·ãŒãžã£ãå€æ°ïŒã®ããŒãã«ãããstrtabã-è¡ã®ããŒãã«ãæ¥é èŸã.debug_ããæã€ã»ã¯ã·ã§ã³ããããã°æ å ±ãªã©ã«ä¿åãããŸãã .dã ããã«ããã¡ã€ã«ã«ã¯å¿ ãã€ã³ããã¯ã¹0ã®ç©ºã®ã»ã¯ã·ã§ã³ãå¿ èŠã§ãã
4.ã»ã¯ã·ã§ã³ããããŒããŒãã«
ããã¯ãã»ã¯ã·ã§ã³ããããŒã®é åãå«ãããŒãã«ã§ãã
ãã®åœ¢åŒã«ã€ããŠã¯ããELFã®äœæãã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãã
DWARFã¬ãã¥ãŒ
DWARFã¯ãæ å ±ããããã°ããããã®æšæºåœ¢åŒã§ãã æšæºã¯ã å ¬åŒWebãµã€ãããããŠã³ããŒãã§ããŸãã ãŸãããã®åœ¢åŒã®çŽ æŽãããç°¡åãªæŠèŠïŒ DWARFãããã°åœ¢åŒã®çŽ¹ä» ïŒMichael J. EagerïŒããããŸãã
ãããã°æ å ±ãå¿ èŠãªã®ã¯ãªãã§ããïŒ æ¬¡ã®ããšãã§ããŸãã
- ç©çã¢ãã¬ã¹ã§ã¯ãªãããœãŒã¹ã³ãŒããã¡ã€ã«ã®è¡çªå·ãŸãã¯é¢æ°åã«ãã¬ãŒã¯ãã€ã³ããèšå®ããŸã
- ã°ããŒãã«å€æ°ãšããŒã«ã«å€æ°ã®å€ãããã³é¢æ°ãã©ã¡ãŒã¿ãŒã®è¡šç€ºãšå€æŽ
- ã³ãŒã«ã¹ã¿ãã¯ã®è¡šç€ºïŒããã¯ãã¬ãŒã¹ïŒ
- 1ã€ã®ã¢ã»ã³ãã©ãŒåœä»€ã§ã¯ãªãããœãŒã¹ã³ãŒãã®è¡ã«æ²¿ã£ãŠãã¹ãããããšã«ããã°ã©ã ãå®è¡ãã
ãã®æ å ±ã¯ããªãŒæ§é ãšããŠä¿åãããŸãã åããªãŒããŒãã«ã¯èŠªããããåãæã€ããšãã§ããDIEïŒãããã°æ å ±ãšã³ããªïŒãšåŒã°ããŸãã åããŒãã«ã¯ãç¬èªã®ã¿ã°ïŒã¿ã€ãïŒãšãããŒãã説æããå±æ§ã®ãªã¹ãïŒããããã£ïŒããããŸãã å±æ§ã«ã¯ãããŒã¿ãä»ã®ããŒããžã®ãªã³ã¯ãªã©ãå¿ èŠãªãã®ããã¹ãŠå«ããããšãã§ããŸãã ããã«ãããªãŒã®å€éšã«æ å ±ãä¿åãããŸãã
ããŒãã¯ãããŒã¿ãèšè¿°ããããŒããšã³ãŒããèšè¿°ããããŒãã®2ã€ã®äž»ãªã¿ã€ãã«åããããŸãã
ããŒã¿ãèšè¿°ããããŒãïŒ
- ããŒã¿åïŒ
- Cã®intåãªã©ã®åºæ¬çãªããŒã¿åïŒDW_TAG_base_typeåã®ããŒãïŒ
- è€åããŒã¿åïŒãã€ã³ã¿ãŒãªã©ïŒ
- é å
- æ§é ãã¯ã©ã¹ããŠããªã³ãã€ã³ã¿ãŒãã§ãŒã¹
- ããŒã¿ãªããžã§ã¯ãïŒ
- å®æ°
- é¢æ°ãã©ã¡ãŒã¿ãŒ
- å€æ°
- ãªã©
åããŒã¿ãªããžã§ã¯ãã«ã¯ãããŒã¿ãé 眮ãããŠããã¢ãã¬ã¹ã®èšç®æ¹æ³ã瀺ãDW_AT_locationå±æ§ããããŸãã ããšãã°ãå€æ°ã¯åºå®ã¢ãã¬ã¹ãæã€ããšãã§ããã¬ãžã¹ã¿ãŒãŸãã¯ã¹ã¿ãã¯äžã«ãããã¯ã©ã¹ãŸãã¯ãªããžã§ã¯ãã®ã¡ã³ããŒã«ãªãããšãã§ããŸãã ãã®ã¢ãã¬ã¹ã¯ããªãè€éãªæ¹æ³ã§èšç®ã§ãããããæšæºã¯ãããããã±ãŒã·ã§ã³åŒãæäŸããŸããããã«ã¯ãç¹å¥ãªå éšã¹ã¿ãã¯ãã·ã³ã®äžé£ã®æŒç®åãå«ããããšãã§ããŸãã
ã³ãŒããèšè¿°ããããŒãïŒ
- ããã·ãŒãžã£ïŒé¢æ°ïŒ-ã¿ã°DW_TAG_subprogramãæã€ããŒãã åå«ããŒãã«ã¯ãå€æ°ã®èª¬æïŒé¢æ°ãã©ã¡ãŒã¿ãŒãšããŒã«ã«é¢æ°å€æ°ïŒãå«ãŸããå ŽåããããŸãã
- ã³ã³ãã€ã«ãŠããã ããã°ã©ã ã®æ å ±ãå«ãŸããä»ã®ãã¹ãŠã®ããŒãã®èŠªã§ãã
äžèšã®æ å ±ã¯ãããdebug_infoãããã³ã.debug_abbrevãã»ã¯ã·ã§ã³ã«ãããŸãã
ãã®ä»ã®æ å ±ïŒ
- è¡çªå·ã«é¢ããæ å ±ïŒã.debug_lineãã»ã¯ã·ã§ã³ïŒ
- ãã¯ãæ å ±ïŒã»ã¯ã·ã§ã³ ".debug_macinfo"ïŒ
- åŒã³åºããã¬ãŒã æ å ±ïŒã.debug_frameãã»ã¯ã·ã§ã³ïŒ
ELFãäœæãã
elfutilsããã±ãŒãžã®libelfã©ã€ãã©ãªã䜿çšããŠEFLãã¡ã€ã«ãäœæããŸãã libelfã®äœ¿çšã«é¢ãããããã¯ãŒã¯ã«é¢ããè¯ãèšäºããããŸã- äŸã«ããLibELF ïŒæ®å¿µãªããšã«ããã®äžã®ãã¡ã€ã«ã®äœæã¯éåžžã«ç°¡åã«èª¬æãããŠããŸã ïŒãšããã¥ã¡ã³ãããããŸã ã
ãã¡ã€ã«ã®äœæã¯ãããã€ãã®æé ã§æ§æãããŸãã
- Libelfã®åæå
- ãã¡ã€ã«ããããŒïŒELFããããŒïŒã®äœæ
- ããã°ã©ã ããããŒã®äœæïŒããã°ã©ã ããããŒããŒãã«ïŒ
- ã»ã¯ã·ã§ã³ãäœæãã
- ãã¡ã€ã«ã¬ã³ãŒã
æé ããã詳现ã«æ€èšããŠãã ããã
Libelfã®åæå
æåã«ãelf_versioné¢æ°ïŒEV_CURRENTïŒãåŒã³åºããŠçµæã確èªããå¿ èŠããããŸãã EV_NONEãšçããå Žåããšã©ãŒãçºçããŠããããã以äžã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸããã 次ã«ããã£ã¹ã¯äžã«å¿ èŠãªãã¡ã€ã«ãäœæãããã®ãã³ãã«ãååŸããŠelf_beginé¢æ°ã«æž¡ãå¿ èŠããããŸãã
Elf * elf_begin( int fd, Elf_Cmd cmd, Elf *elf)
- fd-æ°ããéãããã¡ã€ã«ãžã®ãã³ãã«
- cmd-ã¢ãŒãïŒæ å ±ã®èªã¿åãã«ã¯ELF_C_READãæžã蟌ã¿ã®å Žåã¯ELF_C_WRITEãèªã¿åã/æžã蟌ã¿ã®å Žåã¯ELF_C_RDWRïŒããªãŒãã³ãã¡ã€ã«ã¢ãŒãã«å¯Ÿå¿ããå¿ èŠããããŸãïŒãã®å Žåã¯ELF_C_WRITEïŒ
- elf-ã¢ãŒã«ã€ããã¡ã€ã«ïŒ.aïŒãæäœããå Žåã«ã®ã¿å¿ èŠã§ãããã®å Žåã0ãæž¡ãå¿ èŠããããŸã
ãã®é¢æ°ã¯ããã¹ãŠã®libelfé¢æ°ã§äœ¿çšãããäœæãããèšè¿°åãžã®ãã€ã³ã¿ãŒãè¿ããŸãããšã©ãŒã®å Žåã¯0ãè¿ãããŸãã
ã¿ã€ãã«ãäœæãã
æ°ãããã¡ã€ã«ããããŒã¯ãelf32_newehdré¢æ°ã«ãã£ãŠäœæãããŸãã
Elf32_Ehdr * elf32_newehdr( Elf *elf);
- elf-elf_beginã«ãã£ãŠè¿ããããã³ãã«
ãšã©ãŒã®å Žåã¯0ãæ§é äœãžã®ãã€ã³ã¿ãŒ-ELFãã¡ã€ã«ããããŒãè¿ããŸãã
#define EI_NIDENT 16 typedef struct { unsigned char e_ident[EI_NIDENT]; Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32_Ehdr;
ãã®ãã£ãŒã«ãã®äžéšã¯æšæºçãªæ¹æ³ã§å ¥åãããŸãããäžéšã¯å ¥åããå¿ èŠããããŸãã
- e_ident-èå¥ãã€ãé
åã次ã®ã€ã³ããã¯ã¹ããããŸãã
- EI_MAG0ãEI_MAG1ãEI_MAG2ãEI_MAG3-ãããã®4ãã€ãã«ã¯ã0x7fããELFããšããæåãå«ãŸããŠããå¿ èŠããããŸããããã¯ãelf32_newehdré¢æ°ã«ãã£ãŠæ¢ã«è¡ãããŠããŸãã
- EI_DATA-ãã¡ã€ã«å ã®ããŒã¿ãšã³ã³ãŒãã£ã³ã°ã®ã¿ã€ãã瀺ããŸãïŒELFDATA2LSBãŸãã¯ELFDATA2MSBã 次ã®ããã«ELFDATA2LSBãã€ã³ã¹ããŒã«ããå¿ èŠããããŸããe_ident[EI_DATA] = ELFDATA2LSB
- EI_VERSION-æ¢ã«ã€ã³ã¹ããŒã«ãããŠãããã¡ã€ã«ããããŒããŒãžã§ã³
- EI_PAD-觊ããªãã§ãã ãã
- e_type-ãã¡ã€ã«ã¿ã€ããET_NONE-ã¿ã€ããªããET_REL-移åãããã¡ã€ã«ãET_EXEC-å®è¡å¯èœãã¡ã€ã«ãET_DYN-å ±æãªããžã§ã¯ããã¡ã€ã«ãªã©ã ãã¡ã€ã«ã¿ã€ããET_EXECã«èšå®ããå¿ èŠããããŸã
- e_machine-ãã®ãã¡ã€ã«ã«å¿ èŠãªã¢ãŒããã¯ãã£ãããšãã°EM_386-Intelã¢ãŒããã¯ãã£ã®å ŽåãARMã®å ŽåãEM_ARMïŒ40ïŒãããã«èšè¿°ããå¿ èŠããããŸã-ARM ã¢ãŒããã¯ãã£ã®ELFãåç §
- e_version-ãã¡ã€ã«ããŒãžã§ã³ãEV_CURRENTã«èšå®ããå¿ èŠããããŸã
- e_entry-ãšã³ããªãã€ã³ãã®ã¢ãã¬ã¹ãç§ãã¡ã«ãšã£ãŠã¯å¿ èŠãããŸãã
- e_phoff-ããã°ã©ã ããããŒãã¡ã€ã«ã®ãªãã»ãããe_shoff-ã»ã¯ã·ã§ã³ããããŒãªãã»ãããå¡ãã€ã¶ããªã
- e_flags-ããã»ããµåºæã®ãã©ã°ãã¢ãŒããã¯ãã£ïŒCortex-M3ïŒã®å Žåã0x05000000ïŒABIããŒãžã§ã³5ïŒã«èšå®ããå¿ èŠããããŸã
- e_ehsizeãe_phentsizeãe_phnumãe_shentsizeãe_shnum-觊ããªãã§ãã ãã
- e_shstrndx-ã»ã¯ã·ã§ã³ããããŒãæã€è¡ã®ããŒãã«ãããã»ã¯ã·ã§ã³ã®çªå·ãå«ãŸããŸãã ã»ã¯ã·ã§ã³ããŸã ãªãããããã®çªå·ã¯åŸã§ã€ã³ã¹ããŒã«ããŸã
ããã°ã©ã ã¿ã€ãã«ãäœæãã
ãã§ã«è¿°ã¹ãããã«ãããã°ã©ã ããããŒïŒããã°ã©ã ããããŒããŒãã«ïŒã¯ããã¡ã€ã«ã»ã¯ã·ã§ã³ãšã¡ã¢ãªã»ã°ã¡ã³ãéã®å¯Ÿå¿è¡šã§ãããããŒããŒãåã»ã¯ã·ã§ã³ãæžã蟌ãå Žæã瀺ããŸãã äœæãããã¿ã€ãã«ã¯ãelf32_newphdré¢æ°ã䜿çšããŠäœæãããŸãã
Elf32_Phdr * elf32_newphdr( Elf *elf, size_t count);
- elfã¯ç§ãã¡ã®èšè¿°åã§ã
- count-äœæããããŒãã«èŠçŽ ã®æ°ã ã»ã¯ã·ã§ã³ã¯1ã€ïŒããã°ã©ã ã³ãŒãä»ãïŒã®ã¿ã§ãããããã«ãŠã³ãã¯1ã«ãªããŸãã
ãšã©ãŒãŸãã¯ããã°ã©ã ããããŒãžã®ãã€ã³ã¿ãŒã§0ãè¿ããŸãã
ããããŒããŒãã«ã®åèŠçŽ ã¯ã次ã®æ§é ã«ãã£ãŠèšè¿°ãããŸãã
typedef struct { Elf32_Word p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32_Addr p_paddr; Elf32_Word p_filesz; Elf32_Word p_memsz; Elf32_Word p_flags; Elf32_Word p_align; } Elf32_Phdr;
- p_type-ã»ã°ã¡ã³ãïŒã»ã¯ã·ã§ã³ïŒã®ã¿ã€ããããã§ã¯PT_LOAD-ããŒãå¯èœãªã»ã°ã¡ã³ããæå®ããå¿ èŠããããŸã
- p_offset-ã¡ã¢ãªå
ã«ããŒããããã»ã¯ã·ã§ã³ã®ããŒã¿ãå§ãŸããã¡ã€ã«å
ã®ãªãã»ããã ãã®ã»ã¯ã·ã§ã³.textã¯ããã¡ã€ã«ããããŒãšããã°ã©ã ããããŒã®çŽåŸã«é
眮ãããŸãããããã®ããããŒã®é·ãã®åèšãšããŠãªãã»ãããèšç®ã§ããŸãã ä»»æã®åã®é·ãã¯ãelf32_fsizeé¢æ°ã䜿çšããŠååŸã§ããŸãã
size_t elf32_fsize(Elf_Type type, size_t count, unsigned int version);
- p_vaddrãp_paddr-ã»ã¯ã·ã§ã³ã®ã³ã³ãã³ããããŠã³ããŒããããä»®æ³ããã³ç©çã¢ãã¬ã¹ã ä»®æ³ã¢ãã¬ã¹ããªããããç©çã¢ãã¬ã¹ã«èšå®ããŸããæãåçŽãªå Žåã¯0ã§ããããã¯ãããã°ã©ã ãããŒããããå Žæã ããã§ãã
- p_fileszãp_memsz-ãã¡ã€ã«ããã³ã¡ã¢ãªå ã®ã»ã¯ã·ã§ã³ã®ãµã€ãºã åããã®ããããŸãããããã°ã©ã ã³ãŒãã®ã»ã¯ã·ã§ã³ã¯ãŸã ãªãã®ã§ãåŸã§ã€ã³ã¹ããŒã«ããŸã
- p_flags-ããŒããããã¡ã¢ãªã»ã°ã¡ã³ãã®ã¢ã¯ã»ã¹èš±å¯ã PF_R-èªã¿åããPF_W-æžã蟌ã¿ãPF_X-å®è¡ããŸãã¯ãããã®çµã¿åãããå¯èœã§ãã p_flagsãPF_R + PF_Xã«èšå®ããŸã
- p_align-ã»ã°ã¡ã³ãã®ã¢ã©ã€ã¡ã³ãã4
ã»ã¯ã·ã§ã³ãäœæãã
ããããŒãäœæããããã»ã¯ã·ã§ã³ã®äœæãéå§ã§ããŸãã 空ã®ã»ã¯ã·ã§ã³ã¯ãelf_newscné¢æ°ã䜿çšããŠäœæãããŸãã
Elf_Scn * elf_newscn( Elf *elf);
- elf-elf_beginã«ãã£ãŠä»¥åã«è¿ããããã³ãã«
ãã®é¢æ°ã¯ãã»ã¯ã·ã§ã³ãžã®ãã€ã³ã¿ãŸãã¯ãšã©ãŒæã«0ãè¿ããŸãã
ã»ã¯ã·ã§ã³ãäœæããããã»ã¯ã·ã§ã³ããããŒã«å ¥åããã»ã¯ã·ã§ã³ããŒã¿èšè¿°åãäœæããå¿ èŠããããŸãã
elf32_getshdré¢æ°ã䜿çšããŠãã»ã¯ã·ã§ã³ããããŒãžã®ãã€ã³ã¿ãŒãååŸã§ããŸãã
Elf32_Shdr * elf32_getshdr( Elf_Scn *scn);
- scnã¯ãelf_newscné¢æ°ããååŸããã»ã¯ã·ã§ã³ãžã®ãã€ã³ã¿ãŒã§ãã
ã»ã¯ã·ã§ã³ã®ã¿ã€ãã«ã¯æ¬¡ã®ããã«ãªããŸãã
typedef struct { Elf32_Word sh_name; Elf32_Word sh_type; Elf32_Word sh_flags; Elf32_Addr sh_addr; Elf32_Off sh_offset; Elf32_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info; Elf32_Word sh_addralign; Elf32_Word sh_entsize; } Elf32_Shdr;
- sh_name-ã»ã¯ã·ã§ã³å-ã»ã¯ã·ã§ã³ããããŒã®æååããŒãã«ã®ãªãã»ããïŒã»ã¯ã·ã§ã³.shstrtabïŒ-äžèšã®ãè¡ã®ããŒãã«ããåç §
- sh_type-ã»ã¯ã·ã§ã³ã®ã³ã³ãã³ãã¿ã€ããSHT_PROGBITSãèšå®ããå¿ èŠãããããã°ã©ã ã³ãŒãã®ã»ã¯ã·ã§ã³ãæååããŒãã«ã®ã»ã¯ã·ã§ã³-SHT_STRTABãæåããŒãã«ã®ã»ã¯ã·ã§ã³-SHT_SYMTAB
- sh_flags-çµã¿åãããããšãã§ãããã®ãã¡3ã€ã ããå¿
èŠãªã»ã¯ã·ã§ã³ãã©ã°ïŒ
- SHF_ALLOC-ã»ã¯ã·ã§ã³ãã¡ã¢ãªã«ããŒããããããšãæå³ããŸã
- SHF_EXECINSTR-ã»ã¯ã·ã§ã³ã«ã¯å®è¡å¯èœã³ãŒããå«ãŸããŸã
- SHF_STRINGS-ã»ã¯ã·ã§ã³ã«ã¯è¡ã®ããŒãã«ãå«ãŸããŸã
ãããã£ãŠãããã°ã©ã ã®.textã»ã¯ã·ã§ã³ã«ã¯ããã©ã°SHF_ALLOC + SHF_EXECINSTRãèšå®ããå¿ èŠããããŸã - sh_addr-ã»ã¯ã·ã§ã³ãã¡ã¢ãªã«ããŒããããã¢ãã¬ã¹
- sh_offset-ãã¡ã€ã«å ã®ã»ã¯ã·ã§ã³ãªãã»ãã-ã¿ããããªãã§ãã ãããã©ã€ãã©ãªãã€ã³ã¹ããŒã«ãããŸã
- sh_size-ã»ã¯ã·ã§ã³ãµã€ãº-觊ããªãã§ãã ãã
- sh_link-é¢é£ä»ããããã»ã¯ã·ã§ã³ã®çªå·ãå«ã¿ãŸã;ã»ã¯ã·ã§ã³ã察å¿ããè¡ããŒãã«ã«ãªã³ã¯ããå¿ èŠããããŸãïŒä»¥äžãåç §ïŒ
- sh_info-ã»ã¯ã·ã§ã³ã®ã¿ã€ãã«å¿ããè¿œå æ å ±ã0ã«èšå®
- sh_addralign-ã¢ãã¬ã¹èª¿æŽãã¿ããããªã
- sh_entsize-ã»ã¯ã·ã§ã³ãåãé·ãã®è€æ°ã®èŠçŽ ã§æ§æãããŠããå Žåããã®ãããªèŠçŽ ã®é·ãã瀺ãã觊ããªãã§ãã ãã
ããããŒãåããåŸãelf_newdataé¢æ°ã䜿çšããŠã»ã¯ã·ã§ã³ããŒã¿èšè¿°åãäœæããå¿ èŠããããŸãã
Elf_Data * elf_newdata( Elf_Scn *scn);
- scn-æ°ããã»ã¯ã·ã§ã³ãžã®ãã€ã³ã¿ãåãåããŸããã
ãã®é¢æ°ã¯ããšã©ãŒæã«0ãè¿ãããå ¥åãå¿ èŠãªElf_Dataæ§é äœãžã®ãã€ã³ã¿ãŒãè¿ããŸãã
typedef struct { void* d_buf; Elf_Type d_type; size_t d_size; off_t d_off; size_t d_align; unsigned d_version; } Elf_Data;
- d_buf-ã»ã¯ã·ã§ã³ã«æžã蟌ãŸããããŒã¿ãžã®ãã€ã³ã¿ãŒ
- d_type-ããŒã¿åãELF_T_BYTEã¯ã©ãã«ã§ãé©ããŠããŸã
- d_size-ããŒã¿ãµã€ãº
- d_off-ã»ã¯ã·ã§ã³ã®ãªãã»ããã0ã«èšå®
- d_align-äœçœ®åããã1ã«èšå®å¯èœ-äœçœ®åãããªã
- d_version-ããŒãžã§ã³ãEV_CURRENTã«èšå®ããå¿ èŠããããŸã
ç¹å¥ãªã»ã¯ã·ã§ã³
ãã®ç®çã®ããã«ãæäœéå¿ èŠãªã»ã¯ã·ã§ã³ã®ã»ãããäœæããå¿ èŠããããŸãã
- .text-ããã°ã©ã ã³ãŒããå«ãã»ã¯ã·ã§ã³
- .symtab-ãã¡ã€ã«æåããŒãã«
- .strtabã¯.symtabã»ã¯ã·ã§ã³ã®æåã®ååãå«ãæååããŒãã«ã§ããåŸè ã¯ååèªäœãä¿åããã®ã§ã¯ãªããã€ã³ããã¯ã¹ãä¿åããããã§ãã
- .shstrtab-ã»ã¯ã·ã§ã³åãå«ãè¡ããŒãã«
ãã¹ãŠã®ã»ã¯ã·ã§ã³ã¯åã®ã»ã¯ã·ã§ã³ã§èª¬æããããã«äœæãããŸãããåç¹å¥ãªã»ã¯ã·ã§ã³ã«ã¯ç¬èªã®ç¹æ§ããããŸãã
ã»ã¯ã·ã§ã³.text
ãã®ã»ã¯ã·ã§ã³ã«ã¯å®è¡å¯èœã³ãŒããå«ãŸããŠãããããsh_typeãSHT_PROGBITSã«ãsh_flagsãSHF_EXECINSTR + SHF_ALLOCãsh_addrã«èšå®ããŠããã®ã³ãŒããããŒããããã¢ãã¬ã¹ãèšå®ããå¿ èŠããããŸãã
ã»ã¯ã·ã§ã³.symtab
ãã®ã»ã¯ã·ã§ã³ã«ã¯ãããã°ã©ã ã®ãã¹ãŠã®ã·ã³ãã«ïŒé¢æ°ïŒãšããããèšè¿°ããããã¡ã€ã«ã®èª¬æãå«ãŸããŠããŸãã é·ã16ãã€ãã®ãã®ãããªèŠçŽ ã§æ§æãããŸãã
typedef struct { Elf32_Word st_name; Elf32_Addr st_value; Elf32_Word st_size; unsigned char st_info; unsigned char st_other; Elf32_Half st_shndx; } Elf32_Sym;
- st_name-ã·ã³ãã«åïŒæååããŒãã«.strtabã®ã€ã³ããã¯ã¹ïŒ
- st_value-å€ïŒé¢æ°ã®å ¥åã¢ãã¬ã¹ãŸãã¯ãã¡ã€ã«ã®0ïŒã Cortex-M3ã«ã¯Thumb-2ã³ãã³ãã·ã¹ãã ãããããããã®ã¢ãã¬ã¹ã¯å¥æ°ïŒå®ã¢ãã¬ã¹+ 1ïŒã§ãªããã°ãªããŸãã
- st_size-æ©èœã³ãŒãé·ïŒãã¡ã€ã«ã®å Žåã¯0ïŒ
- st_info-ã·ã³ãã«ã®ã¿ã€ããšãã®ã¹ã³ãŒãã ãã®ãã£ãŒã«ãã®å€ã決å®ãããã¯ãããããŸãã
#define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
ããã§ãbã¯ã¹ã³ãŒããtã¯æåã®ã¿ã€ãã§ã
ã¹ã³ãŒãã¯ãSTB_LOCALïŒæåã¯ä»ã®ãªããžã§ã¯ããã¡ã€ã«ããèŠããªãïŒãŸãã¯STB_GLOBALïŒèŠããïŒã®ããããã§ãã åçŽåããããã«ãSTB_GLOBALã䜿çšããŸãã
æåã¿ã€ã-é¢æ°ã®å Žåã¯STT_FUNCããã¡ã€ã«ã®å Žåã¯STT_FILE - st_other-0ã«èšå®
- st_shndx-ã·ã³ãã«ãå®çŸ©ãããŠããã»ã¯ã·ã§ã³ã®ã€ã³ããã¯ã¹ïŒ.textã»ã¯ã·ã§ã³ã®ã€ã³ããã¯ã¹ïŒããŸãã¯ãã¡ã€ã«ã®SHN_ABSã
scnèšè¿°åã«ããã»ã¯ã·ã§ã³ã€ã³ããã¯ã¹ã¯ãelf_ndxscnã䜿çšããŠæ±ºå®ã§ããŸãã
size_t elf_ndxscn( Elf_Scn *scn);
ã»ã¯ã·ã§ã³ã®ããŒã¿ã¯ããœãŒã¹ããã¹ããä»ããŠé åã«æž¡ããšãã«åéã§ããŸããé åãžã®ãã€ã³ã¿ãŒã¯ãã»ã¯ã·ã§ã³ããŒã¿èšè¿°åïŒd_bufïŒã«æžã蟌ãŸããŸãã
ãã®ã»ã¯ã·ã§ã³ã¯éåžžã®æ¹æ³ã§äœæãããsh_typeã®ã¿ãSHT_SYMTABã«èšå®ããå¿ èŠãããã.strtabã»ã¯ã·ã§ã³ã®ã€ã³ããã¯ã¹ãsh_linkãã£ãŒã«ãã«æžã蟌ãŸããããããããã®ã»ã¯ã·ã§ã³ã¯æ¥ç¶ãããŸãã
ã»ã¯ã·ã§ã³.strtab
ãã®ã»ã¯ã·ã§ã³ã«ã¯ã.symtabã»ã¯ã·ã§ã³ã®ãã¹ãŠã®æåã®ååãå«ãŸããŠããŸãã éåžžã®ã»ã¯ã·ã§ã³ãšããŠäœæãããŸãããsh_typeãSHT_STRTABã«ãsh_flagsãSHF_STRINGSã«èšå®ããå¿ èŠãããããããã®ã»ã¯ã·ã§ã³ã¯è¡ã®ããŒãã«ã«ãªããŸãã
ã»ã¯ã·ã§ã³ã®ããŒã¿ã¯ããœãŒã¹ããã¹ããä»ããŠé åã«æž¡ããšãã«åéã§ããŸããé åãžã®ãã€ã³ã¿ãŒã¯ãã»ã¯ã·ã§ã³ããŒã¿èšè¿°åïŒd_bufïŒã«æžã蟌ãŸããŸãã
ã»ã¯ã·ã§ã³.shstrtab
ã»ã¯ã·ã§ã³-è¡ã®ããŒãã«ã«ã¯ããã¡ã€ã«ã®ãã¹ãŠã®ã»ã¯ã·ã§ã³ã®ããããŒãå«ãŸããç¬èªã®ã¿ã€ãã«ãå«ãŸããŸãã .strtabã»ã¯ã·ã§ã³ãšåãæ¹æ³ã§äœæãããŸãã ã€ã³ããã¯ã¹ãäœæãããããã¡ã€ã«ããããŒã®e_shstrndxãã£ãŒã«ãã«ã€ã³ããã¯ã¹ãæžã蟌ãå¿ èŠããããŸãã
è¡ããŒãã«
è¡ããŒãã«ã«ã¯ã0ãã€ãã§çµããé£ç¶ããè¡ãå«ãŸãããã®ããŒãã«ã®æåã®ãã€ãã0ã§ããå¿ èŠããããŸããããŒãã«ã®è¡ã€ã³ããã¯ã¹ã¯ãããŒãã«ã®å é ããã®ãã€ãåäœã®ãªãã»ããã§ãããããæåã®è¡ 'name'ã¯ã€ã³ããã¯ã¹1ã次ã®è¡ ' var 'ã®ã€ã³ããã¯ã¹ã¯6ã§ãã
ã€ã³ããã¯ã¹0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 \ 0åå\ 0 var \ 0
ãã¡ã€ã«ã¬ã³ãŒã
ãã®ãããããããŒãšã»ã¯ã·ã§ã³ã¯ãã§ã«åœ¢æãããŠããã®ã§ããã¡ã€ã«ã«æžã蟌ãã§libelfãçµäºããå¿ èŠããããŸãã ã¬ã³ãŒãã¯ãelf_updateé¢æ°ã«ãã£ãŠçæãããŸãã
off_t elf_update( Elf *elf, Elf_Cmd cmd);
- elf-ãã³ãã«
- cmd-ã³ãã³ããæžã蟌ã¿ã®å Žåã¯ELF_C_WRITEãšçãããªããã°ãªããŸããã
é¢æ°ã¯ãšã©ãŒæã«-1ãè¿ããŸãã ãšã©ãŒããã¹ãã¯ããšã©ãŒæååãžã®ãã€ã³ã¿ãè¿ãelf_errmsgïŒ-1ïŒé¢æ°ãåŒã³åºãããšã§ååŸã§ããŸãã
èšè¿°åãæž¡ãelf_endé¢æ°ã䜿çšããŠã©ã€ãã©ãªã®æäœãçµäºããŸãã 以åã«éãããã¡ã€ã«ãéããããã ãã«æ®ããŸãã
ãã ããäœæãããã¡ã€ã«ã«ã¯ãããã°æ å ±ãå«ãŸããŠããŸããããããã°æ å ±ã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§è¿œå ããŸãã
DWARFã®äœæ
libdwarfã©ã€ãã©ãªã䜿çšããŠãããã°æ å ±ãäœæããŸããlibdwarfã©ã€ãã©ãªã«ã¯ãããã¥ã¡ã³ããå«ãpdfãã¡ã€ã«ïŒlibdwarf2p.1.pdf-DWARFã®Producer Library InterfaceïŒãä»å±ããŠããŸãã
ãããã°æ å ±ã®äœæã¯ã次ã®æé ã§æ§æãããŸãã
- libdwarfãããã¥ãŒãµãŒã®åæå
- ããŒãã®äœæïŒDIE-ãããã°æ å ±å ¥åïŒ
- ããŒãå±æ§ã®äœæ
- ã³ã³ãã€ã«ãŠãããã®äœæ
- å ±éæ å ±ãšã³ããªã®äœæ
- ããŒã¿åã®äœæ
- ããã·ãŒãžã£ïŒé¢æ°ïŒã®äœæ
- å€æ°ãšå®æ°ãäœæãã
- ãããã°æ å ±ãå«ãã»ã¯ã·ã§ã³ã®äœæ
- ã©ã€ãã©ãªã§ã®äœæ¥ãå®äºãã
æé ããã詳现ã«æ€èšããŠãã ããã
libdwarfãããã¥ãŒãµãŒã®åæå
.symtabã»ã¯ã·ã§ã³ã§æåãäœæãããšåæã«ãã³ã³ãã€ã«æã«ãããã°æ å ±ãäœæããŸãããããã£ãŠãlibelfãåæåãããåŸãELFããããŒãšããã°ã©ã ããããŒãäœæãããåŸãã»ã¯ã·ã§ã³ãäœæãããåã«ã©ã€ãã©ãªãåæåããå¿ èŠããããŸãã
åæåã«ã¯ãdwarf_producer_init_cé¢æ°ã䜿çšããŸãã ã©ã€ãã©ãªã«ã¯ããã«ããã€ãã®åæåé¢æ°ïŒdwarf_producer_initãdwarf_producer_init_bïŒããããããã¥ã¡ã³ãã«èšèŒãããŠããããã€ãã®ãã¥ã¢ã³ã¹ãç°ãªããŸãã ååãšããŠããããã®ãããã䜿çšã§ããŸãã
Dwarf_P_Debug dwarf_producer_init_c( Dwarf_Unsigned flags, Dwarf_Callback_Func_c func, Dwarf_Handler errhand, Dwarf_Ptr errarg, void * user_data, Dwarf_Error *error)
- ãã©ã°-ããã深床ããã€ãé ïŒãªãã«ãšã³ãã£ã¢ã³ãããã°ãšã³ãã£ã¢ã³ïŒãåé 眮ãã©ãŒããããªã©ãããã€ãã®ãã©ã¡ãŒã¿ã決å®ããããŸãã¯ãããã€ãã®å®æ°ã®çµã¿åããããããã®ãã¡DW_DLC_WRITEããã³DW_DLC_SYMBOLIC_RELOCATIONSãå¿ ãå¿ èŠã§ãã
- func-ãããã°æ å ±ã䜿çšããŠELFã»ã¯ã·ã§ã³ãäœæãããšãã«åŒã³åºãããã³ãŒã«ããã¯é¢æ°ã 詳现ã«ã€ããŠã¯ã以äžã®ããããã°æ å ±ã䜿çšããŠã»ã¯ã·ã§ã³ãäœæãããã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
- errhand-ãšã©ãŒãçºçãããšãã«åŒã³åºãããé¢æ°ãžã®ãã€ã³ã¿ãŒã 0ãæž¡ãããšãã§ããŸã
- errarg-errhandé¢æ°ã«æž¡ãããããŒã¿ã¯0ã«èšå®å¯èœ
- user_data-funcé¢æ°ã«æž¡ãããããŒã¿ã¯0ã«èšå®ã§ããŸã
- ãšã©ãŒ-è¿ããããšã©ãŒã³ãŒã
ãã®é¢æ°ã¯ãDwarf_P_Debug-åŸç¶ã®ãã¹ãŠã®é¢æ°ã§äœ¿çšãããèšè¿°åããŸãã¯ãšã©ãŒã®å Žåã¯-1ãè¿ããŸãããšã©ãŒã®å Žåã¯ãšã©ãŒã³ãŒãããããŸãïŒdwarf_errmsgé¢æ°ã䜿çšããŠãã®ã³ãŒããæž¡ããšããšã©ãŒã¡ãã»ãŒãžã®ããã¹ããååŸã§ããŸãïŒ
ããŒãã®äœæïŒDIE-ãããã°æ å ±å ¥åïŒ
äžèšã®ããã«ããããã°æ å ±ã¯ããªãŒæ§é ã圢æããŸãã ãã®ããªãŒã®ããŒããäœæããã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- dwarf_new_dieé¢æ°ã§äœæããŸã
- å±æ§ãè¿œå ããŸãïŒåã¿ã€ãã®å±æ§ã¯ããã®æ©èœã«ãã£ãŠè¿œå ãããŸããããã«ã€ããŠã¯åŸè¿°ããŸãïŒ
ããŒãã¯ãdwarf_new_dieé¢æ°ã䜿çšããŠäœæãããŸãã
Dwarf_P_Die dwarf_new_die( Dwarf_P_Debug dbg, Dwarf_Tag new_tag, Dwarf_P_Die parent, Dwarf_P_Die child, Dwarf_P_Die left_sibling, Dwarf_P_Die right_sibling, Dwarf_Error *error)
- dbg-ã©ã€ãã©ãªã®åæåäžã«åãåã£ãDwarf_P_Debugèšè¿°å
- new_tag-ããŒãã®ã¿ã°ïŒã¿ã€ãïŒ-ãã¡ã€ã«libdwarf.hã«ããå®æ°DW_TAG_xxxx
- parentãchildãleft_siblingãright_sibling-ãããããããŒãã®èŠªãåãå·Šããã³å³ã®é£äººã ãããã®ãã©ã¡ãŒã¿ãŒããã¹ãŠæå®ããå¿ èŠã¯ãããŸãããæ®ãã®ã»ãã0ã®ä»£ããã«1ã€ãæå®ããã ãã§ååã§ãããã¹ãŠã®ãã©ã¡ãŒã¿ãŒã0ã®å ŽåãããŒãã¯ã«ãŒããŸãã¯åé¢ãããŸãã
- ãšã©ãŒ-çºçæã«ãšã©ãŒã³ãŒããå«ãŸããŸã
ãã®é¢æ°ã¯ããšã©ãŒã®å Žåã¯DW_DLV_BADADDRãè¿ããæåããå Žåã¯Dwarf_P_DieããŒããžã®ãã³ãã«ãè¿ããŸã
ããŒãå±æ§ã®äœæ
ããŒãå±æ§ãäœæããããã«ãdwarf_add_AT_xxxxé¢æ°ã®ãã¡ããªãŒå šäœããããŸãã ã©ã®é¢æ°ãå¿ èŠãªå±æ§ãäœæããå¿ èŠãããããå€æããã®ãå°é£ãªå Žåããããããã©ã€ãã©ãªã®ãœãŒã¹ã³ãŒããæ°å調ã¹ãŸããã æ©èœã®äžéšãããã§èª¬æããäžéšã察å¿ããã»ã¯ã·ã§ã³ã§èª¬æããŸãã ãããã¯ãã¹ãŠãownerdieãã©ã¡ãŒã¿ãŒãå±æ§ãè¿œå ãããããŒããžã®ãã³ãã«ãåããerrorãã©ã¡ãŒã¿ãŒã§ãšã©ãŒã³ãŒããè¿ããŸãã
dwarf_add_AT_nameé¢æ°ã¯ãååå±æ§ïŒDW_AT_nameïŒãããŒãã«è¿œå ããŸãã ã»ãšãã©ã®ããŒãã«ã¯ååïŒããã·ãŒãžã£ãå€æ°ãå®æ°ãªã©ïŒãå¿ èŠã§ããäžéšã®ããŒãã«ã¯ååããããŸããïŒã³ã³ãã€ã«åäœãªã©ïŒ
Dwarf_P_Attribute dwarf_add_AT_name( Dwarf_P_Die ownerdie, char *name, Dwarf_Error *error)
- name-å±æ§å€èªäœïŒããŒãåïŒ
ãšã©ãŒæã«DW_DLV_BADADDRãè¿ããæåæã«å±æ§èšè¿°åãè¿ããŸãã
é¢æ°dwarf_add_AT_signed_constãdwarf_add_AT_unsigned_constã¯ãæå®ãããå±æ§ãšãã®çœ²åïŒç¬Šå·ãªãïŒå€ãããŒãã«è¿œå ããŸãã 笊å·ä»ãããã³ç¬Šå·ãªãã®å±æ§ã¯ãå®æ°å€ããµã€ãºãè¡çªå·ãªã©ãèšå®ããããã«äœ¿çšãããŸãã é¢æ°åœ¢åŒïŒ
Dwarf_P_Attribute dwarf_add_AT_(un)signed_const( Dwarf_P_Debug dbg, Dwarf_P_Die ownerdie, Dwarf_Half attr, Dwarf_Signed value, Dwarf_Error *error)
- dbg-ã©ã€ãã©ãªã®åæåäžã«åãåã£ãDwarf_P_Debugèšè¿°å
- attr-å€ãèšå®ãããå±æ§ã¯å®æ°DW_AT_xxxxã§ããããã¡ã€ã«libdwarf.hã«ãããŸã
- value-å±æ§å€
æåããå Žåããšã©ãŒãŸãã¯å±æ§èšè¿°åã®å Žåã«DW_DLV_BADADDRãè¿ããŸãã
ã³ã³ãã€ã«ãŠãããã®äœæ
ããªãŒã«ã¯ã«ãŒããå¿ èŠã§ã-ããã°ã©ã ã«é¢ããæ å ±ïŒããšãã°ãã¡ã€ã³ãã¡ã€ã«ã®ååã䜿çšããããã°ã©ãã³ã°èšèªãã³ã³ãã€ã©ã®ååãæåã®å€§æåãšå°æåã®åºå¥ïŒå€æ°ãé¢æ°ïŒãããã°ã©ã ã®ã¡ã€ã³é¢æ°ãéå§ã¢ãã¬ã¹ããªã©ãå«ãã³ã³ãã€ã«åäœããããŸãããªã©ïŒã ååãšããŠãå±æ§ã¯å¿ èŠãããŸããã ããšãã°ãã¡ã€ã³ãã¡ã€ã«ãšã³ã³ãã€ã©ã«é¢ããæ å ±ãäœæããŸãã
ã¡ã€ã³ãã¡ã€ã«æ å ±
ã¡ã€ã³ãã¡ã€ã«ã«é¢ããæ å ±ãä¿åããã«ã¯ããnameãå±æ§ïŒDW_AT_nameïŒã䜿çšããŸã;ãããŒãå±æ§ã®äœæãã»ã¯ã·ã§ã³ã«ç€ºãããã«ãdwarf_add_AT_nameé¢æ°ã䜿çšããŸãã
ã³ã³ãã€ã©ãŒæ å ±
dwarf_add_AT_produceré¢æ°ã䜿çšããŸãã
Dwarf_P_Attribute dwarf_add_AT_name( Dwarf_P_Die ownerdie, char *producer_string, Dwarf_Error *error)
- producer_string-æ å ±ããã¹ããå«ãæåå
ãšã©ãŒæã«DW_DLV_BADADDRãè¿ããæåæã«å±æ§èšè¿°åãè¿ããŸãã
å ±éæ å ±ãšã³ããªã®äœæ
éåžžãé¢æ°ïŒãµãã«ãŒãã³ïŒãåŒã³åºããããšããã®ãã©ã¡ãŒã¿ãŒãšæ»ãã¢ãã¬ã¹ãã¹ã¿ãã¯ã«ããã·ã¥ãããŸãïŒãã ããåã³ã³ãã€ã©ãŒã¯ç¬èªã®æ¹æ³ã§å®è¡ã§ããŸããïŒãããã¯ãã¹ãŠåŒã³åºããã¬ãŒã ãšåŒã°ããŸãã ãããã¬ãŒã¯ãé¢æ°ããã®æ»ãã¢ãã¬ã¹ãæ£ããå€å¥ããããã¯ãã¬ãŒã¹ïŒçŸåšã®é¢æ°ã«å°éããé¢æ°åŒã³åºãã®ãã§ãŒã³ãããã³ãããã®é¢æ°ã®ãã©ã¡ãŒã¿ãŒïŒãæ§ç¯ããããã«ããã¬ãŒã 圢åŒã«é¢ããæ å ±ãå¿ èŠãšããŸãã ã¹ã¿ãã¯ã«æ ŒçŽãããŠããããã»ããµã¬ãžã¹ã¿ãé垞瀺ãããŸãã ã¹ã¿ãã¯äžã®ã¹ããŒã¹ã確ä¿ããŠããã»ããµã¬ãžã¹ã¿ãä¿åããã³ãŒãã¯ãé¢æ°ã®ããããŒã°ãšåŒã°ããã¬ãžã¹ã¿ãšã¹ã¿ãã¯ã埩å ããã³ãŒãã¯ãšãããŒã°ãšåŒã°ããŸãã
ãã®æ å ±ã¯ãã³ã³ãã€ã©ã«å€§ããäŸåããŠããŸãã ããšãã°ãããããŒã°ãšãšãããŒã°ã¯é¢æ°ã®æåãšæåŸã«ããå¿ èŠã¯ãããŸããã ãã¬ãŒã ã䜿çšãããå Žåãšäœ¿çšãããªãå ŽåããããŸãã ããã»ããµã¬ãžã¹ã¿ã¯ä»ã®ã¬ãžã¹ã¿ãªã©ã«ä¿åã§ããŸã
ãã®ããããããã¬ãŒã¯ãããã»ããµãŒã®ã¬ãžã¹ã¿ãŒãå€ãå€æŽããæ¹æ³ãšãããã·ãŒãžã£ãŒã«å ¥ããšãã«ããããä¿åãããå Žæãç¥ãå¿ èŠããããŸãã ãã®æ å ±ã¯ãã³ãŒã«ãã¬ãŒã æ å ±-ãã¬ãŒã 圢åŒæ å ±ãšåŒã°ããŸãã ããã°ã©ã ã®åã¢ãã¬ã¹ïŒã³ãŒããå«ãïŒã«ã¯ãã¡ã¢ãªå ã®ãã¬ãŒã ã®ã¢ãã¬ã¹ïŒCanonical Frame Address-CFAïŒãšããã»ããµã¬ãžã¹ã¿ã«é¢ããæ å ±ã瀺ãããŸããããšãã°ã次ã®ããã«æå®ã§ããŸãã
- ã¬ãžã¹ã¿ã¯ããã·ãŒãžã£ã«ä¿åãããŸãã
- ã¬ãžã¹ã¿ã¯ããã·ãŒãžã£å ã®å€ãå€æŽããŸãã
- ã¬ãžã¹ã¿ã¯CFA + nã®ã¹ã¿ãã¯ã«ä¿åãããŸã
- ã¬ãžã¹ã¿ã¯å¥ã®ã¬ãžã¹ã¿ã«æ ŒçŽãããŸã
- ã¬ãžã¹ã¿ã¯ã¡ã¢ãªå ã®ããã¢ãã¬ã¹ã«ä¿åãããŸãããããã¯ããªãéèªæãªæ¹æ³ã§èšç®ã§ããŸã
- ãªã©
æ å ±ã¯ã³ãŒãå ã®ã¢ãã¬ã¹ããšã«ç€ºãããå¿ èŠããããããéåžžã«èšå€§ã§ããã.debug_frameã»ã¯ã·ã§ã³ã«å§çž®åœ¢åŒã§ä¿åãããŸãã ã¢ãã¬ã¹ããšã«ã»ãšãã©å€åããªãããããã®å€æŽã®ã¿ãåœä»€DW_CFA_xxxxã®åœ¢åŒã§ãšã³ã³ãŒããããŸãã ååœä»€ã¯ãããšãã°æ¬¡ã®ãããª1ã€ã®å€æŽã瀺ããŸãã
- DW_CFA_set_loc-ããã°ã©ã ã®çŸåšã®ã¢ãã¬ã¹ã瀺ããŸã
- DW_CFA_advance_loc-ãã€ã³ã¿ãŒãç¹å®ã®ãã€ãæ°ã«ç§»åãã
- DW_CFA_def_cfa-ã¹ã¿ãã¯ãã¬ãŒã ã®ã¢ãã¬ã¹ã瀺ããŸãïŒæ°å€å®æ°ïŒ
- DW_CFA_def_cfa_register-ã¹ã¿ãã¯ãã¬ãŒã ã®ã¢ãã¬ã¹ã瀺ããŸãïŒããã»ããµã¬ãžã¹ã¿ããååŸïŒ
- DW_CFA_def_cfa_expression-ã¹ã¿ãã¯ãã¬ãŒã ã®ã¢ãã¬ã¹ã®èšç®æ¹æ³ã瀺ããŸã
- DW_CFA_same_value-ã±ãŒã¹ãå€æŽãããªãããšã瀺ããŸã
- DW_CFA_register-ã¬ãžã¹ã¿ãå¥ã®ã¬ãžã¹ã¿ã«æ ŒçŽãããŠããããšã瀺ããŸã
- ãªã©
.debug_frameã»ã¯ã·ã§ã³ã®èŠçŽ ã¯ãCommon Information EntryïŒCIEïŒãšFrame Description EntryïŒFDEïŒã®2ã€ã®ã¿ã€ãã®ã¬ã³ãŒãã§ããCIEã«ã¯ãå€ãã®FDEãšã³ããªã«å ±éã®æ å ±ãå«ãŸããŠããã倧ãŸãã«èšã£ãŠãç¹å®ã®ã¿ã€ãã®æé ã説æããŠããŸããFDEã§ã¯ãç¹å®ã®åæé ã«ã€ããŠã説æããŠããŸããããã·ãŒãžã£ã«å ¥ããšããããã¬ã¯æåã«CIEããåœä»€ãå®è¡ãã次ã«FDEããåœä»€ãå®è¡ããŸãã
ç§ã®ã³ã³ãã€ã©ã¯ãCFAãspïŒr13ïŒã¬ãžã¹ã¿ã«ããããã·ãŒãžã£ãäœæããŸãããã¹ãŠã®æé ã®CIEãäœæããŸããããã«ã¯dwarf_add_frame_cieé¢æ°ããããŸãã
Dwarf_Unsigned dwarf_add_frame_cie( Dwarf_P_Debug dbg, char *augmenter, Dwarf_Small code_align, Dwarf_Small data_align, Dwarf_Small ret_addr_reg, Dwarf_Ptr init_bytes, Dwarf_Unsigned init_bytes_len, Dwarf_Error *error);
- Augmenterã¯ããã©ãããã©ãŒã åºæã®è¿œå æ å ±ãCIEãŸãã¯FDEã«ããããšã瀺ãUTF-8ãšã³ã³ãŒãæååã§ãã空ã®æååãå ¥ããŸã
- code_align-ãã€ãåäœã®ã³ãŒãã®ã¢ã©ã€ã¡ã³ãïŒ2ããããŸãïŒ
- data_align-ãã¬ãŒã å ã®ããŒã¿é 眮ïŒ-4ã«èšå®ãããŸããããã¯ããã¹ãŠã®ãã©ã¡ãŒã¿ãŒãã¹ã¿ãã¯äžã§4ãã€ããå æããã¡ã¢ãªãŒå ã§å¢å ããããšãæå³ããŸãïŒ
- ret_addr_reg-ããã·ãŒãžã£ããã®æ»ãã¢ãã¬ã¹ãå«ãã¬ãžã¹ã¿ïŒ14åãããŸãïŒ
- init_bytes-DW_CFA_xxxxåœä»€ãå«ãé åãæ®å¿µãªããããã®é åãçæãã䟿å©ãªæ¹æ³ã¯ãããŸãããæåã§äœæããããšããCã³ã³ãã€ã©ãŒã«ãã£ãŠçæãããelfãã¡ã€ã«ã§ã¹ãã€ããããšãã§ããŸããç§ã®å Žåãããã«ã¯3ãã€ããå«ãŸããŸãïŒ0x0Cã0x0Dã0ãããã¯DW_CFA_def_cfaãè¡šããŸãïŒr13 ofs 0ïŒCFAã¯ã¬ãžã¹ã¿r13ã«ããããªãã»ããã¯0ïŒ
- init_bytes_len-init_bytesé åã®é·ã
ãã®é¢æ°ã¯ããšã©ãŒæã«DW_DLV_NOCOUNTãè¿ãããåããã·ãŒãžã£ã®FDEãäœæãããšãã«äœ¿çšããCIEãã³ãã«ãè¿ããŸããããã«ã€ããŠã¯ããFDEããã·ãŒãžã£ã®äœæãã»ã¯ã·ã§ã³ã§èª¬æããŸã
ããŒã¿åã®äœæ
ããã·ãŒãžã£ãšå€æ°ãäœæããåã«ããŸãããŒã¿åã«å¯Ÿå¿ããããŒããäœæããå¿ èŠããããŸããå€ãã®ããŒã¿åããããŸããããããã¯ãã¹ãŠåºæ¬åïŒintãdoubleãªã©ã®åºæ¬åïŒã«åºã¥ããŠãããä»ã®åã¯åºæ¬åããæ§ç¯ãããŠããŸãã
åºæ¬ã¿ã€ãã¯ãã¿ã°DW_TAG_base_typeãæã€ããŒãã§ããå±æ§ãå¿ èŠã§ãïŒ
- ãååãïŒDW_AT_nameïŒ
- ããšã³ã³ãŒããïŒDW_AT_encodingïŒ-æå®ãããããŒã¹ã¿ã€ããèšè¿°ããããŒã¿ãæå³ããŸãïŒããšãã°ãDW_ATE_boolean-è«çãDW_ATE_float-æµ®åå°æ°ç¹ãDW_ATE_signed-æŽæ°ç¬Šå·ãDW_ATE_unsigned-æŽæ°ç¬Šå·ãªããªã©ïŒ
- ããµã€ãºãïŒDW_AT_byte_size-ãã€ãåäœã®ãµã€ãºãŸãã¯DW_AT_bit_size-ãããåäœã®ãµã€ãºïŒ
ããŒãã«ã¯ãä»ã®ãªãã·ã§ã³å±æ§ãå«ãŸããå ŽåããããŸãã
ããšãã°ã32ãããæŽæ°ã®ç¬Šå·ä»ãããŒã¹ã¿ã€ããintããäœæããã«ã¯ãã¿ã°DW_TAG_base_typeã§ããŒããäœæããå±æ§DW_AT_name-ãintããDW_AT_encoding-DW_ATE_signedãDW_AT_byte_size-4.
ãäœæããå¿ èŠããããŸãã ããã®ãããªããŒãã«ã¯ãå±æ§DW_AT_typeãå«ãŸããŠããå¿ èŠããããŸã-åºæ¬ã¿ã€ããžã®ãªã³ã¯ã§ããããšãã°ãintãžã®ãã€ã³ã¿ãŒ-ã¿ã°DW_TAG_pointer_typeãæã€ããŒãã«ã¯ãå±æ§DW_AT_typeã«ä»¥åã«äœæãããã¿ã€ããintããžã®ãªã³ã¯ãå«ãŸããŠããå¿ èŠããããŸãã
å¥ã®ããŒããžã®ãªã³ã¯ãæã€å±æ§ã¯ãdwarf_add_AT_referenceé¢æ°ã«ãã£ãŠäœæãããŸãã
Dwarf_P_Attribute dwarf_add_AT_reference( Dwarf_P_Debug dbg, Dwarf_P_Die ownerdie, Dwarf_Half attr, Dwarf_P_Die otherdie, Dwarf_Error *error)
- attrã¯å±æ§ã§ãããã®å Žåã¯DW_AT_typeã§ã
- otherdie-åç §ãããã¿ã€ãããŒãã®ãã³ãã«
ããã·ãŒãžã£ã®äœæ
ããã·ãŒãžã£ãäœæããã«ã¯ãå¥ã®ã¿ã€ãã®ãããã°æ å ±ã§ããè¡çªå·æ å ±ãæ確ã«ããå¿ èŠããããŸããåãã·ã³åœä»€ããœãŒã¹ã³ãŒãã®ç¹å®ã®è¡ã«ãããã³ã°ããããã°ã©ã ã®è¡ããšã®ãããã°ãå¯èœã«ããŸãããã®æ å ±ã¯.debug_lineã»ã¯ã·ã§ã³ã«ä¿åãããŸããååãªã¹ããŒã¹ãããå Žåããããªãã¯ã¹ã®åœ¢åŒã§æ ŒçŽããããã®ãããªåãæã€åœä»€ããšã«1è¡ãæ ŒçŽãããŸãã
- ãœãŒã¹ãã¡ã€ã«å
- ãã®ãã¡ã€ã«ã®è¡çªå·
- ãã¡ã€ã«å ã®åçªå·
- åœä»€ãæŒç®åãŸãã¯æãããã¯ã®å§ãŸãã§ãããã©ãã
- ãªã©
ãã®ãããªãããªãã¯ã¹ã¯éåžžã«å€§ãããããå§çž®ããå¿ èŠããããŸãããŸããéè€ããè¡ãåé€ããã次ã«è¡èªäœãä¿åãããã®ã§ã¯ãªããå€æŽã®ã¿ãä¿åãããŸãããããã®å€æŽã¯ã¹ããŒããã·ã³ã®ã³ãã³ãã®ããã«èŠããæ å ±èªäœã¯ãã§ã«ãã®ãã·ã³ã«ãã£ãŠãå®è¡ããããããã°ã©ã ãšèŠãªãããŸãããã®ããã°ã©ã ã®ã³ãã³ãã¯ãããšãã°æ¬¡ã®ããã«ãªããŸããDW_LNS_advance_pc âã³ãã³ãã«ãŠã³ã¿ãŒãããã¢ãã¬ã¹ã«é²ããŸããDW_LNS_set_fileâããã·ãŒãžã£ãå®çŸ©ãããŠãããã¡ã€ã«ãèšå®ããŸããDW_LNS_const_add_pcâã³ãã³ãã«ãŠã³ã¿ãŒãæ°ãã€ãé²ããŸãã
ãã®ãããªäœãã¬ãã«ã§ãã®æ å ±ãäœæããããšã¯é£ãããããlibdwarfã©ã€ãã©ãªã«ã¯ããã®ã¿ã¹ã¯ã容æã«ããããã€ãã®æ©èœããããŸãã
ååœä»€ã®ãã¡ã€ã«åãä¿åããã®ã¯ã³ã¹ããããããããååã®ä»£ããã«ãã®ã€ã³ããã¯ã¹ã¯ç¹å¥ãªããŒãã«ã«ä¿åãããŸãããã¡ã€ã«ã€ã³ããã¯ã¹ãäœæããã«ã¯ãdwarf_add_file_declé¢æ°ã䜿çšããå¿ èŠããããŸãã
Dwarf_Unsigned dwarf_add_file_decl( Dwarf_P_Debug dbg, char *name, Dwarf_Unsigned dir_idx, Dwarf_Unsigned time_mod, Dwarf_Unsigned length, Dwarf_Error *error)
- name-ãã¡ã€ã«å
- dir_idx-ãã¡ã€ã«ã眮ãããŠãããã©ã«ããŒã®ã€ã³ããã¯ã¹ãã€ã³ããã¯ã¹ã¯ãdwarf_add_directory_declé¢æ°ã䜿çšããŠååŸã§ããŸãããã«ãã¹ã䜿çšããå Žåããã©ã«ããŒã®ã€ã³ããã¯ã¹ãšããŠ0ãèšå®ããdwarf_add_directory_declããŸã£ãã䜿çšããªãã§ãã ããã
- time_mod-ãã¡ã€ã«å€æŽæéãçç¥å¯èœïŒ0ïŒ
- length-ãã¡ã€ã«ãµã€ãºããªãã·ã§ã³ïŒ0ïŒ
ãã®é¢æ°ã¯ããšã©ãŒæã«ãã¡ã€ã«ã€ã³ããã¯ã¹ãŸãã¯DW_DLV_NOCOUNTãè¿ããŸãã
è¡çªå·ã«é¢ããæ å ±ãäœæããããã«ã3ã€ã®é¢æ°dwarf_add_line_entry_bãdwarf_lne_set_addressãdwarf_lne_end_sequenceããããŸãããããã«ã€ããŠã¯ä»¥äžã§æ€èšããŸãã
ããã·ãŒãžã£ã®ãããã°æ å ±ã®äœæã¯ãããã€ãã®æ®µéã§è¡ãããŸãã
- .symtabã»ã¯ã·ã§ã³ã«ããã·ãŒãžã£ã·ã³ãã«ãäœæãã
- å±æ§ãæã€ããã·ãŒãžã£ããŒãã®äœæ
- FDEããã·ãŒãžã£ã®äœæ
- ããã·ãŒãžã£ãã©ã¡ãŒã¿ã®äœæ
- è¡çªå·æ å ±ã®äœæ
ããã·ãŒãžã£ã·ã³ãã«ã®äœæ
æé ã·ã³ãã«ã¯ãäžèšã®ã.symtabã»ã¯ã·ã§ã³ãã»ã¯ã·ã§ã³ã§èª¬æããããã«äœæãããŸãããã®äžã«ãããã·ãŒãžã£ã·ã³ãã«ã¯ããããã®ããã·ãŒãžã£ã®ãœãŒã¹ã³ãŒããé 眮ãããŠãããã¡ã€ã«ã®ã·ã³ãã«ãæ£åšããŠããŸããæåã«ãã¡ã€ã«ã·ã³ãã«ãäœæããŠãããããã·ãŒãžã£ãäœæããŸãããã®å Žåããã¡ã€ã«ã¯ææ°ã«ãªãã次ã®ããã·ãŒãžã£ãçŸåšã®ãã¡ã€ã«ã«ããå Žåããã¡ã€ã«ã·ã³ãã«ãå床äœæããå¿ èŠã¯ãããŸããã
å±æ§ãæã€ããã·ãŒãžã£ããŒãã®äœæ
æåã«ãdwarf_new_dieé¢æ°ïŒãããŒãã®äœæãã»ã¯ã·ã§ã³ãåç §ïŒã䜿çšããŠããŒããäœæããDW_TAG_subprogramãã¿ã°ãšããŠæå®ããã³ã³ãã€ã«ãŠãããïŒã°ããŒãã«ããã·ãŒãžã£ã®å ŽåïŒãŸãã¯å¯Ÿå¿ããDIEïŒããŒã«ã«ã®å ŽåïŒã芪ãšããŠäœ¿çšããŸãã次ã«ãå±æ§ãäœæããŸãã
- ããã·ãŒãžã£åïŒdwarf_add_AT_nameé¢æ°ããããŒãå±æ§ã®äœæããåç §ïŒ
- ããã·ãŒãžã£ã³ãŒããå§ãŸããã¡ã€ã«ã®è¡çªå·ïŒå±æ§DW_AT_decl_lineïŒãé¢æ°dwarf_add_AT_unsigned_constïŒãããŒãã®å±æ§ã®äœæããåç §ïŒ
- ãã¡ã€ã«åã€ã³ããã¯ã¹ïŒå±æ§DW_AT_decl_fileïŒãdwarf_add_AT_unsigned_consté¢æ°ïŒãããŒãå±æ§ã®äœæããåç §ïŒ
- ããã·ãŒãžã£ã®éå§ã¢ãã¬ã¹ïŒå±æ§DW_AT_low_pcïŒãé¢æ°dwarf_add_AT_targ_addressã以äžãåç §
- ããã·ãŒãžã£ã®æçµã¢ãã¬ã¹ïŒå±æ§DW_AT_high_pcïŒãé¢æ°dwarf_add_AT_targ_addressã以äžãåç §
- ããã·ãŒãžã£ã«ãã£ãŠè¿ãããçµæã®ã¿ã€ãïŒDW_AT_typeå±æ§-以åã«äœæãããã¿ã€ããžã®ãªã³ã¯ããããŒã¿ã¿ã€ãã®äœæããåç §ïŒãããã·ãŒãžã£ãäœãè¿ããªãå Žåããã®å±æ§ãäœæããå¿ èŠã¯ãããŸããã
DW_AT_low_pcããã³DW_AT_high_pcå±æ§ã¯ããã®ããã«ç¹å¥ã«èšèšãããdwarf_add_AT_targ_address_bé¢æ°ã䜿çšããŠäœæããå¿ èŠããããŸãã
Dwarf_P_Attribute dwarf_add_AT_targ_address_b( Dwarf_P_Debug dbg, Dwarf_P_Die ownerdie, Dwarf_Half attr, Dwarf_Unsigned pc_value, Dwarf_Unsigned sym_index, Dwarf_Error *error)
- attr-å±æ§ïŒDW_AT_low_pcãŸãã¯DW_AT_high_pcïŒ
- pc_value-ã¢ãã¬ã¹å€
- sym_index-.symtabããŒãã«å ã®ããã·ãŒãžã£ã·ã³ãã«ã®ã€ã³ããã¯ã¹ããªãã·ã§ã³ã§ã0ãæž¡ãããšãã§ããŸã
ãã®é¢æ°ã¯ããšã©ãŒæã«DW_DLV_BADADDRãè¿ããŸãã
FDEããã·ãŒãžã£ã®äœæ
ãå ±éæ å ±ãšã³ããªã®äœæãã»ã¯ã·ã§ã³ã§èª¬æããããã«ãåæé ã§ã¯ããã¬ãŒã èšè¿°åãäœæããå¿ èŠããããŸããããã¯ããã€ãã®æ®µéã§çºçããŸãã
- æ°ããFDEã®äœæïŒå ±éæ å ±ãšã³ããªã®äœæãåç §ïŒ
- äœæãããFDEãäžè¬ãªã¹ãã«çµåããŸã
- äœæãããFDEã«æ瀺ãè¿œå ãã
dwarf_new_fdeé¢æ°ã䜿çšããŠãæ°ããFDEãäœæã§ããŸãã
Dwarf_P_Fde dwarf_new_fde( Dwarf_P_Debug dbg, Dwarf_Error *error)
é¢æ°ã¯ããšã©ãŒæã«æ°ããFDEèšè¿°åãŸãã¯DW_DLV_BADADDRãè¿ããŸãã
dwarf_add_frame_fdeã䜿çšããŠããªã¹ãã«æ°ããFDEãæ·»ä»ã§ããŸãã
Dwarf_Unsigned dwarf_add_frame_fde( Dwarf_P_Debug dbg, Dwarf_P_Fde fde, Dwarf_P_Die die, Dwarf_Unsigned cie, Dwarf_Addr virt_addr, Dwarf_Unsigned code_len, Dwarf_Unsigned sym_idx, Dwarf_Error* error)
- fde-åãåã£ãã°ããã®ãã³ãã«
- die-DIEããã·ãŒãžã£ïŒå±æ§ãæã€ããã·ãŒãžã£ããŒãã®äœæãåç §ïŒ
- cie-CIEèšè¿°åïŒå ±éæ å ±ãšã³ããªã®äœæãåç §ïŒ
- virt_addr-ããã·ãŒãžã£ã®éå§ã¢ãã¬ã¹
- code_len-ããã·ãŒãžã£ã®é·ãïŒãã€ãïŒ
- sym_idx-ã·ã³ãã«ã€ã³ããã¯ã¹ïŒãªãã·ã§ã³ã0ãæå®ã§ããŸãïŒ
ãã®é¢æ°ã¯ããšã©ãŒæã«DW_DLV_NOCOUNTãè¿ããŸãã
ãã®ãã¹ãŠã®åŸãDW_CFA_xxxxã®æ瀺ãFDEã«è¿œå ã§ããŸããããã¯ãdwarf_add_fde_instããã³dwarf_fde_cfa_offseté¢æ°ã䜿çšããŠè¡ãããŸããæåã®ãã®ã¯ãæå®ãããåœä»€ããªã¹ãã«è¿œå ããŸãïŒ
Dwarf_P_Fde dwarf_add_fde_inst( Dwarf_P_Fde fde, Dwarf_Small op, Dwarf_Unsigned val1, Dwarf_Unsigned val2, Dwarf_Error *error)
- fde-FDEã«ãã£ãŠäœæãããèšè¿°å
- op-åœä»€ã³ãŒãïŒDW_CFA_xxxxïŒ
- val1ãval2-åœä»€ãã©ã¡ãŒã¿ãŒïŒåœä»€ããšã«ç°ãªããæšæºãã»ã¯ã·ã§ã³6.4.2åŒã³åºããã¬ãŒã åœä»€ãåç §ïŒ
dwarf_fde_cfa_offseté¢æ°ã¯ãDW_CFA_offsetã¹ããŒãã¡ã³ããè¿œå ããŸãã
Dwarf_P_Fde dwarf_fde_cfa_offset( Dwarf_P_Fde fde, Dwarf_Unsigned reg, Dwarf_Signed offset, Dwarf_Error *error)
- fde-FDEã«ãã£ãŠäœæãããèšè¿°å
- reg-ãã¬ãŒã ã«æžã蟌ãŸããã¬ãžã¹ã¿
- offset-ãã¬ãŒã å ã®ãªãã»ããïŒãã€ãåäœã§ã¯ãªãããã¬ãŒã èŠçŽ å ãå ±éæ å ±ãšã³ããªã®äœæãdata_alignãåç §ïŒ
ããšãã°ãã³ã³ãã€ã©ã¯ããããŒã°ã«ããã·ãŒãžã£ãäœæãããã®ããã·ãŒãžã£ã®ã¬ãžã¹ã¿lrïŒr14ïŒãã¹ã¿ãã¯ãã¬ãŒã ã«æ ŒçŽãããŸããæåã®ã¹ãããã¯ãæåã®ãã©ã¡ãŒã¿ãŒã1ã®DW_CFA_advance_locåœä»€ãè¿œå ããããšã§ããã€ãŸããpcã¬ãžã¹ã¿ãŒã2ãã€ãé²ãïŒå ±éæ å ±ãšã³ããªãŒã®äœæãcode_alignãåç §ïŒã次ã«ãã©ã¡ãŒã¿ãŒ4ã§DW_CFA_def_cfa_offsetãè¿œå ãïŒãã¬ãŒã å ã®ããŒã¿ãªãã»ããã4ãã€ãèšå®ïŒãåŒã³åºããŸãé¢æ°dwarf_fde_cfa_offsetã¯ãã©ã¡ãŒã¿ãŒreg = 14ãªãã»ãã= 1ã§ãCFAãã-4ãã€ãã®ãªãã»ãããæã€ãã¬ãŒã ã«ã¬ãžã¹ã¿r14ãæžã蟌ãããšãæå³ããŸãã
ããã·ãŒãžã£ãã©ã¡ãŒã¿ã®äœæ
ããã·ãŒãžã£ãã©ã¡ãŒã¿ã®äœæã¯ãéåžžã®å€æ°ã®äœæã«äŒŒãŠããŸãããå€æ°ãšå®æ°ã®äœæããåç §ããŠãã ãã
è¡çªå·æ å ±ã®äœæ
ãã®æ å ±ã®äœæã¯æ¬¡ã®ãšããã§ãã
- æé ã®å§ãã«ãdwarf_lne_set_addressé¢æ°ã䜿çšããŠåœä»€ãããã¯ãéå§ããŸã
- ã³ãŒãã®åè¡ïŒãŸãã¯æ©æ¢°åœä»€ïŒã«å¯ŸããŠããœãŒã¹ã³ãŒãã«é¢ããæ å ±ïŒdwarf_add_line_entryïŒãäœæããŸã
- ããã·ãŒãžã£ã®æåŸã«ãdwarf_lne_end_sequenceé¢æ°ã䜿çšããŠåœä»€ãããã¯ãå®äºããŸã
dwarf_lne_set_addressé¢æ°ã¯ãåœä»€ãããã¯ãå§ãŸãã¢ãã¬ã¹ãèšå®ããŸãã
Dwarf_Unsigned dwarf_lne_set_address( Dwarf_P_Debug dbg, Dwarf_Addr offs, Dwarf_Unsigned symidx, Dwarf_Error *error)
- offs-ããã·ãŒãžã£ã®ã¢ãã¬ã¹ïŒæåã®æ©æ¢°åœä»€ã®ã¢ãã¬ã¹ïŒ
- sym_idx-ã·ã³ãã«ã€ã³ããã¯ã¹ïŒãªãã·ã§ã³ã0ãæå®ã§ããŸãïŒ
0ïŒæåïŒãŸãã¯DW_DLV_NOCOUNTïŒãšã©ãŒïŒãè¿ããŸãã
dwarf_add_line_entry_bé¢æ°ã¯ããœãŒã¹ã³ãŒãã®è¡ã«é¢ããæ å ±ã.debug_lineã»ã¯ã·ã§ã³ã«è¿œå ããŸããæ©æ¢°èªåœä»€ããšã«ãã®é¢æ°ãåŒã³åºããŸãã
Dwarf_Unsigned dwarf_add_line_entry_b( Dwarf_P_Debug dbg, Dwarf_Unsigned file_index, Dwarf_Addr code_offset, Dwarf_Unsigned lineno, Dwarf_Signed column_number, Dwarf_Bool is_source_stmt_begin, Dwarf_Bool is_basic_block_begin, Dwarf_Bool is_epilogue_begin, Dwarf_Bool is_prologue_end, Dwarf_Unsigned isa, Dwarf_Unsigned discriminator, Dwarf_Error *error)
- file_index-dwarf_add_file_declé¢æ°ã«ãã£ãŠä»¥åã«ååŸããããœãŒã¹ã³ãŒããã¡ã€ã«ã®ã€ã³ããã¯ã¹ïŒãããã·ãŒãžã£ã®äœæããåç §ïŒ
- code_offset-çŸåšã®ãã·ã³åœä»€ã®ã¢ãã¬ã¹
- lineno-ãœãŒã¹ã³ãŒããã¡ã€ã«ã®è¡çªå·
- column_number â
- is_source_stmt_begin â 1 lineno ( 1)
- is_basic_block_begin â 1 ( 0)
- is_epilogue_begin â 1 ( , 0)
- is_prologue_end â 1 (!)
- isa â instruction set architecture ( ). DW_ISA_ARM_thumb ARM Cortex M3!
- discriminator. (, , ) . . , 0
ãã®é¢æ°ã¯ã0ïŒæåïŒãŸãã¯DW_DLV_NOCOUNTïŒãšã©ãŒïŒãè¿ããŸãã
æåŸã«ãdwarf_lne_end_sequenceé¢æ°ãæé ãå®äºããŸãã
Dwarf_Unsigned dwarf_lne_end_sequence( Dwarf_P_Debug dbg, Dwarf_Addr address; Dwarf_Error *error)
- address-çŸåšã®æ©æ¢°èªåœä»€ã®ã¢ãã¬ã¹
0ïŒæåïŒãŸãã¯DW_DLV_NOCOUNTïŒãšã©ãŒïŒãè¿ããŸãã
ããã§ããã·ãŒãžã£ã®äœæãå®äºããŸããã
å€æ°ãšå®æ°ãäœæãã
äžè¬ã«ãå€æ°ã¯éåžžã«åçŽã§ãããããã«ã¯ãååãã¡ã¢ãªïŒãŸãã¯ããã»ããµã¬ãžã¹ã¿ïŒãããŒã¿ã®å Žæãããã³ãã®ããŒã¿ã®ã¿ã€ãããããŸããå€æ°ãã°ããŒãã«ã§ããå Žåããã®èŠªã¯ã³ã³ãã€ã«åäœã§ããå¿ èŠããããŸããããŒã«ã«-察å¿ããããŒãïŒç¹ã«ããã·ãŒãžã£ã®ãã©ã¡ãŒã¿ãŒã«é¢ããŠã¯ãããã·ãŒãžã£ã¯èŠªã§ããå¿ èŠããããŸãïŒããŸããå€æ°å®£èšãé 眮ãããã¡ã€ã«ãè¡ãåãæå®ããããšãã§ããŸãã
æãåçŽãªå Žåãå€æ°ã®å€ã¯ããåºå®ã¢ãã¬ã¹ã«ãããŸãããå€ãã®å€æ°ã¯ãã¹ã¿ãã¯ãŸãã¯ã¬ãžã¹ã¿ãŒã«ããã·ãŒãžã£ãå ¥åãããšãã«åçã«äœæãããŸããå€ã®ã¢ãã¬ã¹ã®èšç®ã¯éåžžã«éèŠãªå ŽåããããŸãããã®èŠæ Œã¯ãå€æ°ã®å€ãã©ãã«ããããèšè¿°ããã¡ã«ããºã ãæäŸããŸã-ã¢ãã¬ã¹åŒïŒäœçœ®åŒïŒãã¢ãã¬ã¹åŒã¯ãç Šã®ãããªã¹ã¿ãã¯ãã·ã³çšã®äžé£ã®åœä»€ïŒå®æ°DW_OP_xxxxïŒã§ãããå®éã«ã¯ãåå²ãããã·ãŒãžã£ãããã³ç®è¡æŒç®ãåããå¥åã®èšèªã§ãããã®èšèªãå®å šã«ã¬ãã¥ãŒããã®ã§ã¯ãªããå®éã«ããã€ãã®æ瀺ã«ã®ã¿èå³ããããŸãã
- DW_OP_addr-å€æ°ã®ã¢ãã¬ã¹ã瀺ããŸã
- DW_OP_fbreg-ããŒã¹ã¬ãžã¹ã¿ãŒããã®å€æ°ã®ãªãã»ããã瀺ããŸãïŒéåžžã¯ã¹ã¿ãã¯ãã€ã³ã¿ãŒïŒ
- DW_OP_reg0 ... DW_OP_reg31-å€æ°ã察å¿ããã¬ãžã¹ã¿ã«æ ŒçŽãããããšã瀺ããŸã
ã¢ãã¬ã¹åŒãäœæããã«ã¯ãæåã«ç©ºã®åŒïŒdwarf_new_exprïŒãäœæããåœä»€ïŒdwarf_add_expr_addrãdwarf_add_expr_genãªã©ïŒãè¿œå ããDW_AT_locationå±æ§ïŒdwarf_add_AT_location_expressionïŒã®å€ãšããŠããŒãã«è¿œå ããå¿ èŠããããŸãã
空ã®ã¢ãã¬ã¹åŒãäœæããé¢æ°ã¯ããã³ãã«ãŸãã¯ãšã©ãŒæã«0ãè¿ããŸãã
Dwarf_Expr dwarf_new_expr( Dwarf_P_Debug dbg, Dwarf_Error *error)
åŒã«åœä»€ãè¿œå ããã«ã¯ãdwarf_add_expr_gené¢æ°ã䜿çšããŸãã
Dwarf_Unsigned dwarf_add_expr_gen( Dwarf_P_Expr expr, Dwarf_Small opcode, Dwarf_Unsigned val1, Dwarf_Unsigned val2, Dwarf_Error *error)
- expr-åœä»€ãè¿œå ãããã¢ãã¬ã¹åŒã®èšè¿°å
- opcode-åœä»€ã³ãŒããå®æ°DW_OP_xxxx
- val1ãval2-åœä»€ãã©ã¡ãŒã¿ãŒïŒæšæºãåç §ïŒ
ãã®é¢æ°ã¯ããšã©ãŒæã«DW_DLV_NOCOUNTãè¿ããŸãã
å€æ°ã®ã¢ãã¬ã¹ãæ瀺çã«èšå®ããã«ã¯ãåã®é¢æ°ã®ä»£ããã«dwarf_add_expr_addré¢æ°ã䜿çšããå¿ èŠããããŸãã
Dwarf_Unsigned dwarf_add_expr_addr( Dwarf_P_Expr expr, Dwarf_Unsigned address, Dwarf_Signed sym_index, Dwarf_Error *error)
- expr-åœä»€ãè¿œå ãããã¢ãã¬ã¹åŒã®èšè¿°å
- address-å€æ°ã®ã¢ãã¬ã¹
- sym_index-.symtabããŒãã«å ã®æåã®ã€ã³ããã¯ã¹ããªãã·ã§ã³ã§ã0ãæž¡ãããšãã§ããŸã
ãã®é¢æ°ã¯ããšã©ãŒæã«DW_DLV_NOCOUNTãè¿ããŸãã
æåŸã«ãdwarf_add_AT_location_expré¢æ°ã䜿çšããŠãäœæããã¢ãã¬ã¹åŒãããŒãã«è¿œå ã§ããŸãã
Dwarf_P_Attribute dwarf_add_AT_location_expr( Dwarf_P_Debug dbg, Dwarf_P_Die ownerdie, Dwarf_Half attr, Dwarf_P_Expr loc_expr, Dwarf_Error *error)
- ownerdie-åŒãè¿œå ãããããŒã
- attr-å±æ§ïŒãã®å Žåã¯DW_AT_locationïŒ
- loc_expr-以åã«äœæãããã¢ãã¬ã¹åŒã®ãã³ãã«
é¢æ°ã¯ããšã©ãŒæã«å±æ§èšè¿°åãŸãã¯DW_DLV_NOCOUNTãè¿ããŸãã
å€æ°ïŒããã³ããã·ãŒãžã£ãã©ã¡ãŒã¿ïŒãšå®æ°ã¯ãããããã¿ã°DW_TAG_variableãDW_TAG_formal_parameterãããã³DW_TAG_const_typeãæã€éåžžã®ããŒãã§ãã次ã®å±æ§ãå¿ èŠã§ãã
- å€æ°/å®æ°åïŒdwarf_add_AT_nameé¢æ°ããããŒãå±æ§ã®äœæããåç §ïŒ
- å€æ°ã宣èšãããŠãããã¡ã€ã«ã®è¡çªå·ïŒDW_AT_decl_lineå±æ§ïŒãdwarf_add_AT_unsigned_consté¢æ°ïŒãããŒãå±æ§ã®äœæããåç §ïŒ
- ãã¡ã€ã«åã€ã³ããã¯ã¹ïŒå±æ§DW_AT_decl_fileïŒãdwarf_add_AT_unsigned_consté¢æ°ïŒãããŒãå±æ§ã®äœæããåç §ïŒ
- å€æ°/å®æ°ããŒã¿åïŒå±æ§DW_AT_type-以åã«äœæãããåãžã®ãªã³ã¯ããããŒã¿åã®äœæããåç §ïŒ
- ã¢ãã¬ã¹åŒïŒäžèšãåç §ïŒ-å€æ°ãŸãã¯ããã·ãŒãžã£ãã©ã¡ãŒã¿ã«å¿ èŠ
- ãŸãã¯å€-å®æ°ã®å ŽåïŒå±æ§DW_AT_const_valueããããŒãå±æ§ã®äœæããåç §ïŒ
ãããã°æ å ±ãå«ãã»ã¯ã·ã§ã³ã®äœæ
ãããã°æ å ±ããªãŒã®ãã¹ãŠã®ããŒããäœæããããããã䜿çšããŠãšã«ãã»ã¯ã·ã§ã³ã®åœ¢æã«é²ãããšãã§ããŸããããã¯2段éã§çºçããŸãã
- ãŸããdwarf_transform_to_disk_formé¢æ°ãåŒã³åºãå¿ èŠããããŸãããã®é¢æ°ã¯ãã»ã¯ã·ã§ã³ããšã«å¿ èŠãªelfã»ã¯ã·ã§ã³ãäœæããããã«äœæããé¢æ°ãåŒã³åºããŸã
- åã»ã¯ã·ã§ã³ã«ã€ããŠãdwarf_get_section_bytesé¢æ°ã¯ã察å¿ããã»ã¯ã·ã§ã³ã«æžã蟌ãå¿ èŠãããããŒã¿ãè¿ããŸã
æ©èœ
dwarf_transform_to_disk_form ( Dwarf_P_Debug dbg, Dwarf_Error* error)
äœæãããããã°æ å ±ããã€ããªåœ¢åŒã«å€æããŸããããã£ã¹ã¯ã«ã¯äœãæžã蟌ã¿ãŸãããäœæãããelfã»ã¯ã·ã§ã³ã®æ°ãŸãã¯ãšã©ãŒæã«DW_DLV_NOCOUNTãè¿ããŸããåæã«ãåã»ã¯ã·ã§ã³ã«å¯ŸããŠã³ãŒã«ããã¯é¢æ°ãåŒã³åºãããŸããããã¯ãã©ã€ãã©ãªãåæåãããšãã«dwarf_producer_init_cé¢æ°ã«æž¡ããŸããããã®é¢æ°ãèªåã§äœæããå¿ èŠããããŸãããã®ä»æ§ã¯æ¬¡ã®ãšããã§ãã
typedef int (*Dwarf_Callback_Func_c)( char* name, int size, Dwarf_Unsigned type, Dwarf_Unsigned flags, Dwarf_Unsigned link, Dwarf_Unsigned info, Dwarf_Unsigned* sect_name_index, void * user_data, int* error)
- name-äœæãããelfã»ã¯ã·ã§ã³ã®åå
- ãµã€ãº-ã»ã¯ã·ã§ã³ãµã€ãº
- type-ã»ã¯ã·ã§ã³ã¿ã€ã
- ãã©ã°-ã»ã¯ã·ã§ã³ãã©ã°
- ãªã³ã¯-ã»ã¯ã·ã§ã³éä¿¡ãã£ãŒã«ã
- info-ã»ã¯ã·ã§ã³æ å ±ãã£ãŒã«ã
- sect_name_index-åé 眮ã䌎ãã»ã¯ã·ã§ã³ã®ã€ã³ããã¯ã¹ãè¿ãå¿ èŠããããŸãïŒãªãã·ã§ã³ïŒ
- user_data-ã©ã€ãã©ãªåæåé¢æ°ã§èšå®ããã®ãšåãããã«æž¡ãããŸã
- ãšã©ãŒ-ããã§ãšã©ãŒã³ãŒããæž¡ãããšãã§ããŸã
ãã®é¢æ°ã§ã¯ã次ã®ããšãè¡ãå¿ èŠããããŸãã
- æ°ããã»ã¯ã·ã§ã³ãäœæããŸãïŒelf_newscné¢æ°ãã»ã¯ã·ã§ã³ã®äœæãåç §ïŒ
- ã»ã¯ã·ã§ã³ããããŒãäœæããŸãïŒelf32_getshdré¢æ°ãåäžïŒã
- æ£ããèšå ¥ããŠãã ããïŒåæžåç §ïŒãã»ã¯ã·ã§ã³ã®ããããŒãã£ãŒã«ãã¯é¢æ°ã®ãã©ã¡ãŒã¿ãŒã«å¯Ÿå¿ããŠãããããããã¯ç°¡åã§ããsh_addrãsh_offsetãsh_entsizeã0ã«èšå®ãããsh_addralignã1ã«èšå®ãããŠããªããã£ãŒã«ã
- äœæãããã»ã¯ã·ã§ã³ã®ã€ã³ããã¯ã¹ïŒé¢æ°elf_ndxscnããã»ã¯ã·ã§ã³.symtabããåç §ïŒãè¿ããããšã©ãŒãçºçããå Žåã¯-1ãè¿ããŸãïŒãšã©ãŒã³ãŒãããšã©ãŒã«èšå®ããŠïŒ
- ã.relãã»ã¯ã·ã§ã³ãã¹ãããããå¿ èŠããããŸãïŒãã®å ŽåïŒãé¢æ°ããæ»ããšãã«0ãè¿ããŸã
å®äºåŸãdwarf_transform_to_disk_formé¢æ°ã¯äœæãããã»ã¯ã·ã§ã³ã®æ°ãè¿ããŸãã次ã®æé ã«åŸã£ãŠãã»ã¯ã·ã§ã³ããšã«0ãããµã€ã¯ã«ãå®è¡ããå¿ èŠããããŸãã
- dwarf_get_section_bytesé¢æ°ã䜿çšããŠã»ã¯ã·ã§ã³ã«æžã蟌ãããã®ããŒã¿ãäœæããŸãã
Dwarf_Ptr dwarf_get_section_bytes( Dwarf_P_Debug dbg, Dwarf_Signed dwarf_section, Dwarf_Signed *elf_section_index, Dwarf_Unsigned *length, Dwarf_Error* error)
- dwarf_section-ã»ã¯ã·ã§ã³çªå·ã0..nã®ç¯å²ã§ãªããã°ãªããŸãããnã¯ãdwarf_transform_to_disk_formé¢æ°ã«ãã£ãŠè¿ãããæ°å€ã§ãã
- elf_section_index-ããŒã¿ãæžã蟌ãã»ã¯ã·ã§ã³ã®ã€ã³ããã¯ã¹ãè¿ããŸã
- length-ãã®ããŒã¿ã®é·ã
- ãšã©ãŒ-䜿çšãããŠããŸãã
é¢æ°ã¯ãåä¿¡ããããŒã¿ãžã®ãã€ã³ã¿ãŒãŸãã¯0ãè¿ããŸãïŒ
äœæããã»ã¯ã·ã§ã³ããããªãå ŽåïŒ - çŸåšã®ã»ã¯ã·ã§ã³ã®ããŒã¿èšè¿°åãäœæãïŒelf_newdataé¢æ°ãã»ã¯ã·ã§ã³ã®äœæãåç
§ïŒããããèšå®ããŸãïŒåæžãåç
§ïŒã
- d_buf-åã®é¢æ°ããåä¿¡ããããŒã¿ãžã®ãã€ã³ã¿ãŒ
- d_size-ãã®ããŒã¿ã®ãµã€ãºïŒåäžïŒ
ã©ã€ãã©ãªã§ã®äœæ¥ãå®äºãã
ã»ã¯ã·ã§ã³ã圢æãããããlibdwarfé¢æ°dwarf_producer_finishãçµäºã§ããŸãã
Dwarf_Unsigned dwarf_producer_finish( Dwarf_P_Debug dbg, Dwarf_Error* error)
ãã®é¢æ°ã¯ããšã©ãŒæã«DW_DLV_NOCOUNTãè¿ããŸãã
ãã®æ®µéã§ã®ãã£ã¹ã¯ãžã®æžã蟌ã¿ã¯å®è¡ãããªãããšã«æ³šæããŠãã ãããèšé²ã¯ããELFã®äœæ-ãã¡ã€ã«ã®èšé²ãã»ã¯ã·ã§ã³ã®æ©èœã䜿çšããŠè¡ãå¿ èŠããããŸãã
ãããã«
以äžã§ãã
ç¹°ãè¿ããŸããããããã°æ å ±ã®äœæã¯éåžžã«åºç¯ãªãããã¯ã§ãããã«ãŒãã³ãéãã ãã§å€ãã®ãããã¯ã«ã¯è§ŠããŸããã§ãããåžæãã人ã¯ç¡éã«è¡ãããšãã§ããŸãã
質åãããã°ãç§ã¯ãããã«çããããšããŸãã
åç §è³æ
ELF
- ä»æ§æž
- ARMã¢ãŒããã¯ãã£ã®ELF
- äŸã«ããlibELF
- elfutils
- libelfã®ããã¥ã¢ã«ããŒãž