概要
Linux kernel 4.7-rc1がreleaseされたが、buildでコケた。
Build environment
* Intel Core i7-6700K + DDR4 64GByte
* Debian Sid / Experimental
* gcc.real (Debian 6.1.1-4) 6.1.1 20160519
* Linux 4.7-rc1 (from Git)
* time (MAKEFLAGS= DEBIAN_BUILDARCH=native CONCURRENCY_LEVEL=8 CC='ccache gcc' CXX='ccache g++' fakeroot make-kpkg --initrd kernel_image)
error message
いつも通り、早速make-kpkgでbuildを試みたのだが、見事にコケた:
> CC arch/x86/boot/edd.o
> /tmp/ccENSHy1.s: Assembler messages:
> /tmp/ccENSHy1.s:35: Error: instruction `shlx' isn't supported in 16-bit mode.
> /tmp/ccENSHy1.s:39: Error: instruction `andn' isn't supported in 16-bit mode.
> CC arch/x86/boot/main.o
> scripts/Makefile.build:289: recipe for target 'arch/x86/boot/cpucheck.o' failed
> make[2]: *** [arch/x86/boot/cpucheck.o] Error 1
> make[2]: *** Waiting for unfinished jobs....
見ての通り、16bit modeでsupportされていないinstructionが使われている。
workaround
arch/x86/以下にあるcodeは-m32でcompileされるんじゃないのかな?と思い、関係しているであろうarch/x86/boot/Makefile@68を編集 (-m32を追加):
KBUILD_CFLAGS := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP
↓
KBUILD_CFLAGS := $(USERINCLUDE) $(REALMODE_CFLAGS) -D_SETUP -m32
これでbuildは通ったが、本当にこんなworkaroundで大丈夫なのかは不明。
ちなみに、Linux 4.6では全く同じ環境でbuildが通っているので、Linux 4.7で色々変わった関係だろう。