Slide 41
Slide 41 text
PerlでELFファイルをパースする(ELFヘッダ)
- まずはELFヘッダをパース
- 今回は struct Elf64_Ehdr を
参考に実装
- ELF Fileをreadをして、
substrで文字列のように切りだし
て、unpackでPerlのデータ構造に
変換することで実現
- unpack: 指定されたバイナリデータを
テンプレート文字列に合わせてPerlの
データ構造に変換する組み込み関数
my $byte_offset = 0;
my $byte_range = 16;# ELFヘッダは16バイト
# e_identをパース
my ( $magic, $class, $endian, $version, $abi, $abi_version )
= unpack( 'A4C3A5C2',
substr( $data, $byte_offset, $byte_offset + $byte_range ) );
$byte_offset += $byte_range;
$byte_range = 32;
# 細かいのは中略 ...
# ELFファイルのサイズなどを取得
my ($e_type, $e_machine, $e_version, $e_entry,$e_phoff, $e_shoff,
$e_flags, $e_ehsize, $e_phentsize, $e_phnum, $e_shentsize,
$e_shnum, $e_shstrndx)= unpack( 'S S L Q Q Q L S S S S S S',
substr( $data, $byte_offset, $byte_offset + $byte_range ) );
cf. https://github.com/takehaya/Sys-Ebpf/blob/main/lib/Sys/Ebpf/Elf/Parser.pm#L60