🐥

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