k41531

実行可能ファイルのシンボルとは

簡単な要約

アプリのサイズを小さくしたという記事を読んだが、シンボルという単語の意味が分からなく理解に苦しんだというお話です。この記事を見つけたHacker Newsではアプリのサイズに関するコメントが多数寄せられていますが、そこには触れないのでご注意ください。

本題

Hacker News を読んでいる際に、I shaved 187MB off United Airlines' 439MB iOS app という投稿に票が集まっていたので元のブログを読んでみました(こんなブログを書きたい)
Hacker News

筆者は、Stripで働くフルスタックエンジニアで、今回話題になっていたのは飛行機に乗った時のある出来事の記事でした。

内容を簡単にまとめてみます。
飛行機に乗った際、席に映画などを鑑賞したりできるにディスプレイがなく、鑑賞するにはその航空会社のストリーミングアプリをしなければなりませんでした。最近はこういうことが多く特に驚くことでもないようですが、筆者はそのアプリをダウンロードして驚きました。ファイルサイズが439MBもあったのです。

そこでアプリを解析したところ、原因がフレームワークのシンボルであることを突き止め、シンボルを削除してみたところ187MBも削減することが出来たと言った内容です。

詳細は元の記事を見ていただくとして、これを読んだ時に「フレームワークのシンボルってなんだ?」と思いました。今思えば「変数名や関数名」のことを示していると自然に理解できますが、読んだ当時は何か難しいものだと考えてしまいました。

実行可能ファイルのシンボルとは、先ほども述べたように「変数名や関数名」のことです。私が混乱した原因は実行可能ファイルはただのバイナリだから文字列などは含まれないと思い込んでいたことにあります。ただ、よく考えてみると実行ファイルをstringコマンドにかけた時に文字列が出力されるのでそんなことはないということに気づきました。
また、このシンボル情報を悪用することで、内部情報を盗み見ることもできるようです。

さて、記事では「シンボル情報を削除してファイルサイズを削減した」と述べているのですが、このシンボルは消してしまっても良いのかという疑問も出てきました。
ここについては記事内に言及されており「Swiftアプリのシンボルは削除する必要があると記憶している」と書かれています。どいうことだろうと調べてみたところ、Stack Over Flowの以下の記事がヒットしました。
https://stackoverflow.com/questions/46077700/what-does-strip-swift-symbols-in-xcode-actually-do

このページでは、Xcodeの画像も共に掲載されており、ビルドの設定として"Strip Swift Symbols"とあったので、これに見覚えがあったおかげで、シンボルを削除しても良いと考えたのかと思います。

これにて、この記事をだいたい理解することが出来ました。Hacker Newsのコメント欄も白熱しており面白いので是非読んでみてください。

最後に記事に出てきたコマンドについてもまとめておきます。

  • ipatool : App Store からiOSアプリを検索し、ipaファイルのコピーをダウンロードできる
  • nm : オブジェクトファイルや実行可能ファイルのシンボル情報を表示するコマンド
  • strip : オブジェクトファイルからシンボル情報を除去するコマンド