ある合宿参加者の記録

この記事はカレーのち ぴょこりんクラスタ Advent Calendar 2018のために書いたものです。 ちなみにこのAdvent Calendarが何なのかについては、主催者による紹介記事を見てください。

サマリ

  • ぴょこりんクラスタ 夏の大ハッカソン(仮)*1が10月開催
  • そのときの作業ログをもとに合宿を振り返りと、今だから言えるコメントを追記する

合宿における自分の役割

  • 会議室予約、ホテル予約、会計
  • 参加者

参加者(全部はてなidで表記、順不同)

企画者によるメモ

合宿で何をやったか

これの前身を作っていた。

合宿前日以前

  • 09/13

    • 宿泊地が決まり、予約を取る
  • 09/22

    • darumapからしおりが届く
    • テルチェックイン前の作業スペースとして、貸会議室を予約する
  • 10/08

    • LT用の原稿を作成する
    • markdownをpandocでスライドにしようとして、フォント設定でちょっとはまる
    • 最終的にこれをヘッダとして差し込んで解決した。WSLでやってたのでYu Gothic使いたかったけど、 Source Han Serifはきれいなフォントだったのであきらめることとした。
    • Windows 10 Homeだと、野良exeファイルを拡張子に紐付けられないことに気づかず*2、1時間くらい消費した。
---
title: Pyokkorin hackathon camp first lightning talk
author: nbisco
date: 2018/10/27
header-includes:
    - \usepackage{luatexja-otf}
    - \usepackage{luatexja-fontspec}
    - \setmainjfont{Source Han Serif}
    - \setsansjfont{Source Han Sans JP}
    - \hypersetup{unicode=true}
    - \renewcommand{\kanjifamilydefault}{\gtdefault}
---

合宿日当日

  • 1日目 10:00 合宿開始
    • みんな時間どおり集まり、ライトニングトークを始める
    • 自分のPCはUSB Type-CもしくはType-Aしかなくて、プロジェクタにつなぐのに手間取った。 ドライバ落としてきたらなんとかなった。
    • 各自担当分野が全く違うので、話を聞いてて楽しい。ただし、助け合いは無理そう。
  • 1日目 11:15 ライトニングトーク終了、作業開始
  • 1日目 12:08 手作業による/proc/{pid}/memの読み書きを確認
    • readelfで読み取った値を手計算してアドレス算出
    • 環境は以下
  • 1日目 12:13 DWARFについての勉強着手

    • 今だから言える:ここですでに方向性を間違えている。自分が必要だったのはシンボルテーブルの内容であって、デバッグ情報じゃなかった。 以降、ゴールに関係ない迷走で2時間消滅する。
    • 参考資料1: https://qiita.com/mhiramat/items/8df17f5113434e93ff0c
    • 参考資料2: http://www.dwarfstd.org/Home.php
    • DWARF表現: DWARF内でlocationを表現するために用いるスタックマシンに対する演算命令(せっかくmarkdownで表形式にしたので載せておく)
      • reg0、reg1、...、reg31: 汎用レジスタ。個々のアーキと対応付けられる。
      • regx: 汎用レジスタを示すオペコード。引数がレジスタ番号になる(例: regx 0はreg0)
      • fbreg: フレームレジスタの値からの相対オフセットでメモリ上に保存されている場所を示すためのオペコード。 オフセットを表す引数を1つ取る。
      • breg0、breg1、...、breg31: 汎用レジスタからの相対オフセットでメモリ上に保存されている場所を示す。 オフセットを表す引数を1つ取る。
      • bregx: 汎用レジスタからの値からの相対オフセットでメモリ上に保存されている場所を示す。 このオペコードはレジスタ番号とオフセットを表す引数を2つ取る。
      • addr, const*: アドレス値や定数値を示すオペコード。仮引数が定数の場合などに使われる。
      • x86のアドレスとの対応(http://www.ucw.cz/~hubicka/papers/abi/node14.html)
      dwarf x86_64 memo
      r0 rax general purpose
      r1 rdx general purpose
      r2 rcx general purpose
      r3 rbx general purpose
      r4 rsi general purpose
      r5 rdi general purpose
      r6 rbp Frame Pointer
      r7 rsp Stack Pointer
      r8-15 r8-r15 extended integer register
      r16 return address
      r17-24 xmm0-7 SSE registers
      r25-32 xmm8-15 Extend SSE
      r33-40 st0-7 floating point register
      r41-48 mm0-7 MMX register
  • 1日目 14:00 会議室から出て移動

  • 1日目 16:22 宿チェックイン
    • 部屋は広いし、無線LANはそこそこ速いしでよかった
    • 眺めもよい
  • 1日目 17:00 libdwの使い方がさっぱりわからないので、src/addr2line.cを覗いてみるも、やっぱりよくわからない
    • 今だから言える:この時点でも迷走は続いている。libdwなんて見る必要なかった。
  • 1日目 18:00くらい libdwを使うのは一旦諦め、小さいサンプルが手に入ったlibbfdを使うことにする
  • 1日目 18:24 libbfdのサンプルをビルドして期待通り動くことを確認した
    • ツールはこんな感じにする
      • input: グローバル変数名と設定する値
      • output: 以前の値と更新後の値
      • 処理フロー
        1. 対象バイナリのグローバル変数のシンボルとアドレスの一覧を作成する
        2. シンボルと入力されたグローバル変数名のマッチング
        3. マッチングがとれればアドレスを計算して、メモリにI/O
  • 1日目 18:50 darumapを迎えにホテルロビーへ。ついでに晩ごはん。
  • 1日目 20:30 晩飯終了。やはりというかやむなしというか、酒を各自購入して部屋に戻る。
    • Before: これは真面目な会なので酒はNG
    • After: やっぱりなんかアルコールほしい気がするんだよな~~~~~
    • 今だから言える:やはりお祭りとしての側面もあるので仕方ないよね。
  • 1日目 20:35 作業再開
  • 1日目 22:00 darumap、突如キングギドラ公開処刑を大音量で流し始める。僕はリアルなので手を叩いた。
  • 1日目 22:30 温泉タイム。露天風呂に入れないのが残念。
  • 1日目 23:20 再開
  • 1日目 24:05 いろいろあきらめた手法で4Byteの書き換えに成功。動くのが正義だ。
  • 1日目 24:15 区切りがついてしまったので、あきらめて酒を飲み始めた
  • 1日目 24:45 全員に悪い空気が伝染してしまい、mow*3開始。 頑なに酒を拒否していたdarumap、「酒を入れざるを得ない」といいおもむろに飲み始める。
  • 1日目 25:15 2ラウンドして終了
  • 1日目 25:30 就寝
  • 2日目 5:00 起床。だがすぐに2度寝。
  • 2日目 6:30 再度起床。
  • 2日目 6:45 朝食
  • 2日目 7:30 露天風呂
  • 2日目 8:00 作業再開
    • ここでは主にスライドづくり。内容を詳しく知らない人に伝える文章というのは難しいので、訓練が必要だと切実に思った。
    • Google Slidesが書きやすくていい。LibreOfficeなんかよりもずっと軽快に動く。
  • 2日目 9:30 成果発表
    • みんなの力作が見られて本当に楽しかった。自由に質問が出るし、誰も怒る人はいない。
  • 2日目 10:45 チェックアウト
  • 2日目 12:00 昼飯 & 解散
  • 2日目 16:00 帰宅・休憩して作業再開
  • 2日目 17:00 binutilsのソースを覗いたら、libbfdを使わずに実装しました and libbfdでは取れない情報もある みたいなことが書いてあったので諦めてelfutilsを使うか、直接自分でバイナリ読むソース書いたほうがいいんじゃないかという気がする。 しかし今日のところはここまで。疲れた。
  • N日後 これを作ってアドベントカレンダーの記事を作成、今に至る。

反省

  • よかった
    • 知らない分野に触れられた
    • 発表までしたことで理解が深まった
    • 終始集中して作業できた
  • いまいち
    • 調査不足でだいぶ迷走した
  • どちらともとれる
    • 1泊は短いような、ちょうどよいような。
    • みんなで助け合いみたいなこともやってみたかった。助け合いがなかったので集中できたという説はある。

おわりに

学びも成果も大きいのでまたやりたい。

*1:もくもく会だったりいろいろ呼び方があるので仮扱い

*2:あくまで挙動からの推測

*3:みんな知能を失う楽しいゲームです