Upgrade to Pro — share decks privately, control downloads, hide ads and more …

cybozu-labs-youth-10th

Ec9465c5a5f2ea26a80db56f9d2f99b0?s=47 Drumato
March 30, 2021

 cybozu-labs-youth-10th

第10期ラボユース成果発表会での発表資料.
https://labs.cybozu.co.jp/en/

Ec9465c5a5f2ea26a80db56f9d2f99b0?s=128

Drumato

March 30, 2021
Tweet

Transcript

  1. x64/aarch64コンパイラを含む ミニツールチェーン+αの開発 第10期ラボユース成果発表会 言語処理系ゼミ 菅原大和/Drumato

  2. 一年間まとめ • x86_64/AArch64コードの生成ができるコンパイラを設計/実装した ◦ 生成コードの効率は悪いが,Typed ASTという中間表現を用いてシンプル • x86_64用のELFを生成するミニツールチェーンを実装した ◦ 上記コンパイラ+アセンブラ/リンカが協調動作する

    • 高い抽象度を持たせたRust用ELFライブラリを開発した • 上記ライブラリでTUI版readelfを実装した • 既存のリンカスクリプトの欠点を考察し,一つのアイデアを提案した ◦ 後ほど解説
  3. 目次 • デモ • 一年間で達成できた目標/できなかった目標 • Linker Script Generatorについて •

    これからの目標
  4. DEMO1: ツールチェーンの動作 (6/9時点の画像)

  5. None
  6. DEMO2:TUI版readelfでの解析

  7. None
  8. 一年間で達成できた目標#実装物 • peachili … 自作言語とそれをサポートするコンパイラ ◦ アセンブラとリンカをシンプルにするため,Bundlerが動いて依存関係を解決しグラフを構築 ◦ 複数のファイルで構成されたPeachiliコードから,最終的に単一のアセンブリファイルを生成 •

    asmpeach … x86_64のアセンブラ ◦ 構成としては,アセンブリファイルのパーサ/命令の変換/オブジェクトファイルの生成 • pld … x86_64のstatic linker • elf-utilities … RustでELFをスマートに使えるライブラリ ◦ できるだけスマートに使えるように多くを抽象化している ▪ ex. セクション追加時にユーザがehdr.e_shnumをインクリメントしなくていい等 • elfpeach … TUIで操作できるreadelf ◦ これも最低限の機能しか持っておらず,実質プロトタイプ • py-linkage … Linker Script Generator(ただしプロトタイプ) ◦ これについては後述
  9. 一年間で達成できなかった目標 • コンパイラのアーキテクチャは結局初歩的なものだった ◦ スタックマシン実装であり,生成コードの効率は非常に悪い ◦ SecHack365参加時はなんちゃってレジスタマシン実装だったが,よっぽど速い ◦ 最適化パスは実装できなかった •

    作りたかった言語機能のいくつかを保留にした ◦ Arena Allocatorのような標準ライブラリ ◦ RustのEnumやZigのtagged unionのような機能 ◦ Goのような言語組み込みのテストフレームワーク
  10. 活動2ヶ月後に とりあえず "最小の自作ツールチェーン"は 達成した

  11. まだまだ開発することは沢山ある (動的リンカ/言語拡張/LTO/etc)

  12. ところで,他になにか "新しいこと"はできないか?

  13. アイデア: Linker Script Generatorについて

  14. Linker Script Generator#background • 既存のリンカはconfiguration interfaceにリンカスクリプトを用意 • リンカスクリプトは重要かつ便利だが,学習コストが高い ◦ 特に日本語のドキュメントは少なく,理解しづらい

    • section size/location pointerの計算など,ある程度表現力を持つ ◦ yamlなどの(学習コストが低くて)読みやすい形式では代替できない ◦ "スクリプト"の機能がなければならない
  15. Pythonライブラリを動かして configを"生成"できないか?

  16. Linker Script Generator#proposal in Python • 新たに文法を覚える必要はない ◦ 普通のPythonライブラリを使ったコーディング •

    Pythonの計算を経由して,最終的に数値がハードコードされたyamlを生成 ◦ 出力フォーマットを指定でき,リンカスクリプトのフォーマットも吐ける ▪ 既存リンカ/自作リンカのどちらでも役立つ • 別にPythonじゃなくても,"スクリプト"レベルのフットワークで書ければ良い
  17. Linker Script Generator#proposal in Python • 現状はほぼプロトタイプであり,机上の空論 • 鋭意実装中 ◦

    elf-parserとfile-translator, リンカスクリプトの仕様に即した計算機能
  18. None
  19. 成果発表後の目標

  20. これからの目標(一部) • elf-utilitiesはRustで一番使われるELFライブラリを目指したい • elfpeachにも高級な機能を用意したい ◦ e.g. シンボルテーブルのフィルタリング機能 • 最適化コンパイラの理論と実装

    ◦ まずはx64のバックエンドだけを変更する • py-linkageはGNU ldのデフォルトスクリプトを置き換えられるぐらいの規模 がほしい
  21. 最後に • メンターの方々には多くの助言を頂きました ◦ 特に川合さんにはラボユース活動自体の紹介もしていただきました • ユース生/研究生の皆さんの活動が励みになりました ◦ xxさんも頑張ってるし,私も頑張ろう ここで改めてお礼させていただきます

    一年間(以上)ありがとうございました!