Chapter 07無料公開

Symbol Table Parser Challenge

Drumato
Drumato
2021.08.29に更新
このチャプターの目次

Symbol Table Parser Challenge

ここではここまでに勉強した事の総合テストとして,
symbol tableを格納するsectionの中身をparseする ,ということをやってみてください.
それに必要な知識のほとんどは既に身についていると思います.

やり方(とそれに必要な事前知識)を説明します.

  • やり方
    • section header tableをiterateします
    • section type == SHT_SYMTAB でfilterします
      • sht.iter().filter(|shdr| shdr.ty == SectionType::SymTab) みたいな感じ
    • section contentsを shdr.sh_offset をもとにseekします
      • raw[shdr.sh_offset..(shdr.sh_offset+shdr.sh_size)] のようになると思います
      • symbol tableの各entryは Elf64_Sym という構造体になっています(/usr/include/elf.h をcheck)
      • symbol tableのentry数は shdr.sh_size // shdr.sh_entsize で計算可能です
      • これでsht/phtと同様に nom::multi::count() を使って作れます(clojureにするのを忘れずに!)
    • 次にsymbol nameですが,これも同じようにsymbol name tableが必要です
      • symbol name tableのsection indexは symtab_section_header.sh_link が表しています
      • 私のelfpeachの実装もそのように出力する
      • readelfはprimitive valueしか出さないのでわかりづらい
  • 注意点
    • symbol tableにも同様にnull symbolが存在します

完成させると自分が今まで定義した関数のsymbolとかが見れてめっちゃ楽しいです.
ただしRust elfだとmanglingされてたりめっちゃ出てくるのでよくわからないです,でも楽しい.
C programをgccでbuildすればめっちゃちっちゃいのでそっちで見ると良いかも.