Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RubyKaigi 2024 followup
Search
ahogappa
September 03, 2024
110
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RubyKaigi 2024 followup
ahogappa
September 03, 2024
More Decks by ahogappa
See All by ahogappa
Rubyで楽して タスクを書きたい!
ahogappa
0
270
The Ruby One-Binary Tool, Enhanced with Kompo
ahogappa
1
3.3k
It’s about time to pack Ruby and Ruby scripts in one binary
ahogappa
1
7.3k
Featured
See All Featured
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.8k
Building AI with AI
inesmontani
PRO
1
1.1k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Color Theory Basics | Prateek | Gurzu
gurzu
0
410
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
380
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
370
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.6k
Transcript
ahogappa kompoのその後 RubyKaigi 2024 followup 1
© 2020 Coiney, Inc. • ahogappa • STORES, Inc 自己紹介
2 2
© 2020 Coiney, Inc. • RubyとRubyスクリプトをワンバイナリにする gem(kompo)を作った話 ◦ モチベーション ◦
デモ ◦ 実装方法 ◦ Future Works RubyKaigiで何を話したの 3 3
© 2020 Coiney, Inc. • RubyKaigiでFuture Worksとしていた部分 ◦ 内部ファイルシステムへの自由なアクセス ◦
クロスコンパイル ◦ ファイルの圧縮 • STORES Tech Blogに書いた記事を元に発表資料にしてい ます ◦ https://product.st.inc/entry/2024/06/25/100008 ◦ この記事以降に更新があった内容も含まれています 今日話すこと 4 4
© 2020 Coiney, Inc. • お手軽であること ◦ 簡単にワンバイナリ化できて欲しい ◦ 複雑なオプションはなるべくいらないようにしたい
• それなりに速度が出ること ◦ 簡単にできても遅くなってしまうと、元のコードを チューニングする必要があったり、諦めてしまう ◦ クロスコンパイルできること kompoのコンセプト 5 5
© 2020 Coiney, Inc. • requireをパッチすることで、 内部ファイルシステムにアクセスしている 内部ファイルシステムへの自由なアクセス 6 6
© 2020 Coiney, Inc. • requireの代わりに `eval File.read(“hoge.rb”)` を実行す るようなコードが対応できない
◦ 例えばRubyGems gem ◦ デモの時は誤魔化していた • 内部ファイルにアクセスできる手段をrequire以外にも開 放する ◦ 内部ファイルを取得したい!を明示的にできるような 何かを作る必要がある 内部ファイルシステムへの自由なアクセス 7 7
© 2020 Coiney, Inc. • 実現するためにやらないといけないこと • “ちゃんとした”ファイルシステムの構築 • open,
readなどの関数をパッチする => パッチした関数が呼ばれたら内部ファイルシステムに繋げる • “ちゃんとした”ファイルシステムの構築 ◦ 今はファイルの中身を巨大なバイト列として保持している ◦ ディレクトリの情報や更新情報などのfile statに必要な情報を 持っていない • open, readなどの関数をパッチする ◦ ruby-packer gemはこの方法でrailsまで動かしている 内部ファイルシステムへの自由なアクセス 8 8
© 2020 Coiney, Inc. • ファイルシステムとして必要な機能は基本的に読み込みだけ ◦ 書き込みが要求されたら、本物のファイルシステムを使ってあげる ◦ ファイルパスを与えられたらfd(のような何か)を返して、fdでアク
セスされたらデータを返すような実装をすればいいはず • FUSEも試してみた ◦ macはmacfuse、windowsはそもそもない?ということで、環境差 異がありそう ◦ バイナリを実行する環境にfusermountコマンドのインストールが 必要 “ちゃんとした”ファイルシステムの構築 9 9
© 2020 Coiney, Inc. • 関数をパッチする方法 ◦ #defineを使ってコンパイル時に関数を置き換える ◦ LD_PRELOADを使ってリンクする関数を変える
◦ -Wl,--wrapを使ってリンク時に関数を読み替える • ruby-packer では#defineを使ってパッチしている ◦ ruby本体に変更を加える必要がある ◦ rubyの変更に追従する必要がある • LD_PRELOADは共有ライブラリにする必要がある ◦ 動的リンク時に解決 ◦ パッチファイルを共有ライブラリにして配布する必要がある • -Wl,--wrapが使えそう...? ◦ rubyに変更を加える必要がない&静的リンクで解決 ◦ GNU Linker限定のオプション • 別解でIFUNCとかもありそう open, readなどの関数をパッチする 10 10
© 2020 Coiney, Inc. • -Wl,--wrapってどんなことをやっているのかlldとmoldの コードを読む • 意外とやっていることは少ない open,
readなどの関数をパッチする 11 11 ref: https://github.com/rui314/mold/blob/ed4cae93542350c863eff7e10131272b4c01fe0e/src/input-files.cc#L641-L652
© 2020 Coiney, Inc. • リンカの種類に依存せずにこれを実現できないか • とはいえリンカを作るのは大変すぎる • シンボルを読み替えればいいだけなので、コンパイル後バ
イナリを編集したらできそう? ◦ libstatic-ruby.aに対してバイナリ編集する ◦ rubyだけで実現できれば、rustを使う必要がなくなる ◦ LIEFのruby版みたいなのを作る必要がある open, readなどの関数をパッチする 12 12
© 2020 Coiney, Inc. • やりたいが、全然何も考えられていない ◦ 特にWindows • 先程のバイナリ編集はELFを想定しているので、Mach-O,
PEのことを考える必要があるはず クロスコンパイル 13 13
© 2020 Coiney, Inc. • こちらも何も考えられていない ◦ 発表した当初から変わらずzlibで固めるかな... • そもそもどんなデータをワンバイナリに含めるか
◦ minifyしたもの ◦ ASTを小さく表現するほうが小さくなる? ◦ boot snapのように事前コンパイルしたもののほうが速 度は出そう • ただのminifyだったらminifyrbでいいじゃないかな ファイルの圧縮 14 14
© 2020 Coiney, Inc. • 関数をパッチする方法を考えている&実装している • ELF(などの実行形式ファイル)について調べている • やることたくさん
まとめ 15 15
ありがとうございました! 16
© 2020 Coiney, Inc. • namespace ◦ 拡張ライブラリは静的リンクしたいのでリンク時に シンボルが重なってこけそう ◦
マングリングする??? ◦ ワンバイナリに含めておいて、それをいい感じに参照 する??? おまけ 17 17