書籍の補足情報

書籍の内容について,出版後に気がついた点などをその都度追記していきます.

■ 誤記など

■ cross-gcc494-v1.0 でのAArch64の不備について (2018/02/08)

シミュレータ動作のためのサンプルプログラムで, AArch64のスタックポインタ設定に不備があることが判明しました.

対象となるのは,以下の3つのファイルです.

cross-gcc494/exec/lib-aarch64-elf.S
cross2-gcc494/exec/lib-aarch64-elf.S
cross2-gcc494/printf/lib-aarch64-elf.S

上記3つのファイル中にスタートアップがあり,スタックポインタを初期化している 部分があります(以下).ここで _estack の値は .long で定義されており, 32ビット値になっています.しかしAArch64は64ビット・アーキテクチャで スタックポインタも64ビットのため,ここから値をロードしようとしたときに, 後続の4バイトも含めた64ビット値としてロードしてしまい,スタックポインタの 上位32ビット値が不定になってしまうようです.(スタックポインタがとんでもなく 大きな値となり,スタック操作している箇所で動作がおかしくなったりします)

        .globl  _start
        .type   _start, %function
_start:
        ldr     x0, _stack_addr
...
        .align 4
_stack_addr:
        .long   _estack
配布している cross-gcc494-v1.0 のコンパイル済みモジュール(aarch64-elf.x)では, 上記対象となる3つとも,たまたま後続の4バイトがオールゼロになっているため 実害は起きませんが,モジュールを再生成したりすると構成が変化して問題が起きる かもしれません.

正しくは,以下のようにして .quad を使って8バイト値として定義するようにします. (アラインメントも8バイトにします)

        .align 8
_stack_addr:
        .quad   _estack

メールは kozos(アットマーク)kozos.jp まで