🐥
error: unrecognized argument in option ‘-mcmodel=kernel’
状況
- Buildrootでファイルシステムを作成
- x86のマシンで、arm用にクロスコンパイル
原因
aarch64のgccにx86用のコマンドが渡されていた
MakefileでKERNELDIR ?= /lib/modules/$(shell uname -r)/buildがセットされていたが、
これはホスト(x86)のカーネルのパスが設定される
クロスコンパイルの場合はターゲット(arm)のカーネルのパスを渡さないといけない
対策
.mkのビルドコマンドで、KERNELDIRを上書きする
LINUX_DIRはbuildrootがターゲット用のパスを設定してくれる
define XXX_BUILD_CMDS
$(MAKE) -C $(@D)/ KERNELDIR=$(LINUX_DIR) ARCH=$(KERNEL_ARCH) CROSS_COMPILE="$(TARGET_CROSS)"
endef
以下のような書き方もある(自分ではやってないが、chatGPT的にはこっちが正攻法らしい)
define XXX_BUILD_CMDS
$(MAKE) -C $(LINUX_DIR) \
ARCH=$(KERNEL_ARCH) \
CROSS_COMPILE=$(TARGET_CROSS) \
M=$(@D) \
modules
endef
Discussion