3

基本的に、mach オブジェクト ファイルから Linux カーネルにオブジェクト コードを読み込んでリンクする作業をいじってprintkいます。3 つ (4 つ以上) を超える引数 ( printk("%d,%d,%d \n", 1, 1, 1)) を指定して printk を呼び出すと、システムはロックしますが、後である時点で (システム コールから戻らず、代わりにロックするだけです)。実際の印刷は機能し、すべての場合に期待される値を印刷します。

さて、奇妙なことに、これは Clang+LLVM を使用してビルドした場合にのみ発生します。犯人コードは次のとおりです。

バッド・クラン

一方、これを LLVM GCC を使用してビルドすると、問題なく動作します。

LLVM GCC

これは、GNU GCC でビルドされた場合にも機能します。

GNU GCC

誰かがclangバージョンがシステムをロックアップさせる理由を提案できますか? 基本的に、コードの最初のスニペットに何か問題があり、他のコードには存在しないロックアップを引き起こします。何が悪いのかよくわかりません。

4

1 に答える 1

4

オブジェクト ファイルをどのように生成したかはわかりませんが、基本的に大幅に変更された APCS (「古い」ARM ABI) である Darwin ABI を使用しているようです。ただし、Linux などでは、多くの場合 APCS とは異なる EABI (別名 AAPCS) を使用する必要があります。

たとえば、R9 は EABI で呼び出し保存されますが、ダーウィンでは呼び出しが上書きされ、64 ビット値の受け渡しなどに違いがあります。clang の例では R9 が上書きされますが、llvm-gcc では上書きされないことに注意してください:)

于 2012-08-01T07:36:43.077 に答える