テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

ld: Unable to insert branch island. No insertion point available. for architecture armv7

UnityでiOSビルドを行う際、稀に以下のようなエラーが出ることがある。

ld: Unable to insert branch island. No insertion point available. for architecture armv7

これはリファレンス(トラブルシューティング / Trouble Shooting)を確認する限り 一つのモジュールにコードが多すぎる 事で発生するようだ。つまりDLLのサイズが極端に大きい場合に発生する。その為、もしこのエラーが発生した場合はソースコードの量を減らす必要があるらしい。

この問題は全体のコードを減らす必要は無いらしく、1個のファイルが極端に大きくなければ良いらしい。例えば、plugins等にソースコードを移動し別DLLとしたり、 Unityで、自作Assetをdllファイルにコンパイルする で処理を分割するといった方法や、Strippingレベルを調整する(ソースの不要な機能をDLLから削除する)事で対策が可能との事。使わないアセットのサンプル等をEditorフォルダに放り投げるのも良いだろう。



このエラーについてだが、単純にソースコードが多い等と共に、C#のコードジェネレータやコードにデータ構造を直接埋め込んだ場合にも発生するらしい。

例えばC/C++においては任意のデータを次のような配列構造にしてソースに埋め込む事がよくある。

struct HogeDataType { int x, y, z, w; };
static HogeDataType bigEmbedDataArray[] = {
{ 193, 879, 432, 923 },
{ 874, 950, 857, 920 },
// 以下数千行続く
};

C/C++におおいてはこの配列は見た目通りのメモリを消費するだけなのだが、これと同じコードをC#で組むとアセンブリのサイズが著しく肥大化する事があるらしい。これはC#では静的なデータの定義もコードを生成する際コンストラクタの逐次実行文としてアセンブリ化される為との事。

もしこういった実装でデータを定義している場合、データを外部に持つような構造にしたほうが良さそうだ。