kubo39's blog

ただの雑記です。

LDCにおいてもはや必要なくなったcopy-relocation checkのためのワークアラウンドを消した話

LDCのバグで困っている、というので調査をしてみた。

調べてみると、どうもこれはLDCで実行バイナリを生成する場合(より正確にはmain関数を定義している場合)のみ行われるcopy-relocation checkのために必要とされるようだ。

なんでcopy-relocation checkが必要とされているかというと、モジュールの衝突検出を行う際に用いられているためである。

モジュールの衝突検知は共有オブジェクトをロード/リンクした際に別のモジュール空間のModuleInfoと同一セグメントに置かれていないかどうかをチェックする機構である。 もし同一セグメント上に重なって配置してしまうとModuleInfoは(たぶん)後からロードされた共有ライブラリのほうがセグメントをひっそりと上書きしてしまうのでユーザが意図しない挙動を引き起こしたりする。 copy-relocationのロジックはあまりちゃんと読んでいないが、どうやらdruntimeを特別扱いするために必要なようだ。

しかしモジュール衝突検知はdruntimeから削除されており、そのためcopy-relocation checkももはや DMD LDC ともに存在していない。 そのためLDCはcopy-relocation checkのためのワークアラウンドなシンボル作成を必要としなくなっている。

これを削除するプルリクエストはすでに投げており、マージはしてもらえそうだがシンボル情報を使っているライブラリがあるかもしれないということでv1.19ではひとまず入らない方向となっている。