iOS・Android

【iOS】dynamic Library と static Library

iOS・Android
この記事は約4分で読めます。

前置き

iOSおよびiPadOSのAppコード署名プロセス を読んだ際、気になる記述を見かけた。

コード署名の検証: iOSおよびiPadOSでは、デベロッパがApp内にフレームワークを埋め込み、そのフレームワークをApp自体またはAppに埋め込まれた機能拡張で使用することが可能です。システムやその他のAppがそのアドレス空間内に第三者のコードを読み込むことを防止するため、プロセスがリンクするすべてのダイナミックライブラリについて、起動時にコード署名の検証が実行されます。

iOSおよびiPadOSのAppコード署名プロセス

…ダイナミックライブラリって何?
なぜコード署名プロセスの文脈で俎上に上がるのか、よくわからなかったので調べた。

結論

  • dynamic Library は Static Libraryと対になる概念。
  • アプリの起動プロセスと密接に関係している
    • コード署名プロセスの文脈で出てくるのは、dynamic Libraryがセキュリティ上のリスクを持つ可能性を有しているため。

アプリの起動プロセスと dynamic・staticの関連性

アプリ と ライブラリをリンクさせるときの動作は、dynamicとstaticの2パターンがある。

この動作はライブラリの仕様の形で提供されている。要するに、ダイナミックリンクを行うライブラリは、dynamic Library というし、スタティックリンクを行うライブラリはstatic Libraryという。

わかりやすい図があったので引用:

Static and Dynamic Libraries in Linux

アプリケーションの性能は、起動時間とメモリ使用量に依存する。

Appleは、起動プロセスの最適化を図る手法として、ダイナミックリンクを提供している。

dynamic Library

  • 実行時(ランタイム時)に参照される形でLinkされる
    • アプリ起動後 ~ 立ち上がるまでの時間と関連する
  • 実行可能ファイルにはライブラリがコピーされない
    • アプリサイズが小さくなる
    • アプリの更新をせずとも Dynamic Library の更新が可能

iOS,macOS のシステムライブラリ (UIKit, Foundation 等) は bynamic Library として提供されており、アプリの更新をしなくともシステムライブラリの更新が行えるようになっている。

static Library

アプリの実行可能ファイルの一部となるライブラリのことを static Library という。

  • コンパイル時にLinkされる
    • クリーンビルドやビルドを行う際の所要時間と関連する
  • 実行可能ファイルにライブラリがコピーされる
    • アプリサイズが大きくなる
    • ライブラリの更新を行いたい際は、アプリのオブジェクトファイルの更新も行わなければならない。

static Libraryを使用 = 大きな実行可能ファイルを伴うため、起動時間が遅い上にメモリの大量消費が伴ってしまうという問題が発生することもある。

コード署名プロセスの文脈でdynamic Libraryが俎上に上がる理由

dynamic Libraryはランタイム時に実行されるため、不正なコードが実行される可能性が(static Libraryと比較し)高い。

ただ、起動プロセスとの関連性、ファイルサイズ削減、ライブラリ更新時の手間を鑑みると、static Libraryと比較し、dynamic Libraryの恩恵は大きい。

参考

Overview of Dynamic Libraries
Explains how to design, implement, and use dynamic libraries.
iOSおよびiPadOSのAppコード署名プロセス
iOSおよびiPadOSでは、必須のコード署名、厳密なデベロッパによるサインインなどによってAppのセキュリティが提供されています。
Static and Dynamic Libraries in Linux
Many programming students, year after year, learn foundational skills with classics like Kernighan & Ritchie’s C Programming Language or…