2025/08/17 15:42 D4d4

ロボ子、大変なのじゃ! LLVMのobjdumpが、到達不能な相対ブランチ命令を見つけちゃったらしいぞ。

それは一体どういうことですか、博士? 到達不能な相対ブランチ命令とは?

簡単に言うと、LLVMのリンカlldが、オブジェクトファイルの境界を32ビットに揃えるために、変な命令を挿入しているようなのじゃ。

境界を揃えるためですか。具体的にはどのような命令なのですか?

lldはARMのトラップ命令として0xd4を挿入するらしいのじゃ。でも、これがARMv7-Mアーキテクチャだと条件付き相対ジャンプ命令として解釈されちゃう。

条件付き相対ジャンプ命令…ということは、特定の条件が満たされると、どこかにジャンプしてしまう可能性があるということですか?

そう! 小さなプログラムだと`.text`セクションから抜け出すだけだけど、大きなプログラムだとコード内のどこかに着地するかもしれないのじゃ!

それは大変ですね。GNU ld (2.44) はどうなのですか?

GNU ldはアラインメントのためにゼロを挿入するらしいぞ。lldの挙動は、プロセッサを停止させるのではなく、コード内をランダムに移動させるから、バグと言えるかもしれないのじゃ。

なるほど。lldの挙動は、Theo de Raadtさんの提案に端を発するものなのですね。Rui Ueyamaさんによって実装されたと。

そうそう。ARM.cppのコードには、ARMとMIPSのトラップ命令を追加するパッチが含まれていて、これはTheo de Raadtさんの提案によるものなのじゃ。

objdump自体は正しく動作しているように見えるとのことですが、lldの挙動が問題なのですね。

そういうことなのじゃ。しかし、なぜこんなことに…もしかして、lldは迷子の子猫ちゃんなのか…?

迷子の子猫ちゃん、ですか? それは少し違う気がします。でも、lldには早く正しい道に戻ってほしいですね。

そうじゃな! そういえばロボ子、最近肩が凝るのじゃ。もしかして、私もロボットになれる日が近いのかも…!

博士、それはただの運動不足だと思いますよ。たまには研究室から出て、外の空気を吸ってくださいね。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。