web-dev-qa-db-ja.com

カーネルはコンパイルでPICモードをサポートしていませんか?

Ubuntu 16.10で最新のLinux v4.8.9カーネルをコンパイルしようとしましたが、デフォルトの.configを作成し、menuconfigで変更し、makeを単独で実行した後、このエラーが表示され続けます。また、ファイルを展開したらすぐにmake mrproperを実行しました。これは、makeを実行した直後の出力です。

scripts/kconfig/conf  --silentoldconfig Kconfig
  SYSTBL  Arch/x86/entry/syscalls/../../include/generated/asm/syscalls_32.h
  SYSHDR  Arch/x86/entry/syscalls/../../include/generated/asm/unistd_32_ia32.h
  SYSHDR  Arch/x86/entry/syscalls/../../include/generated/asm/unistd_64_x32.h
  SYSTBL  Arch/x86/entry/syscalls/../../include/generated/asm/syscalls_64.h
  SYSHDR  Arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_32.h
  SYSHDR  Arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_64.h
  SYSHDR  Arch/x86/entry/syscalls/../../include/generated/uapi/asm/unistd_x32.h
  HOSTCC  Arch/x86/tools/relocs_32.o
  HOSTCC  Arch/x86/tools/relocs_64.o
  HOSTCC  Arch/x86/tools/relocs_common.o
  HOSTLD  Arch/x86/tools/relocs
  CHK     include/config/kernel.release
  UPD     include/config/kernel.release
  WRAP    Arch/x86/include/generated/asm/clkdev.h
  WRAP    Arch/x86/include/generated/asm/cputime.h
  WRAP    Arch/x86/include/generated/asm/dma-contiguous.h
  WRAP    Arch/x86/include/generated/asm/early_ioremap.h
  WRAP    Arch/x86/include/generated/asm/mcs_spinlock.h
  WRAP    Arch/x86/include/generated/asm/mm-Arch-hooks.h
  CHK     include/generated/uapi/linux/version.h
  UPD     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  UPD     include/generated/utsrelease.h
  CC      kernel/bounds.s
kernel/bounds.c:1:0: error: code model kernel does not support PIC mode
 /*

Kbuild:45: recipe for target 'kernel/bounds.s' failed
make[1]: *** [kernel/bounds.s] Error 1
Makefile:1015: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2

また、makeコマンドの後に-no-pieオプションを使用してコンパイルしようとしましたが、一連の新しいエラーが表示され、「ターゲットが見つからない」と常に言われます。 gccバージョン6.2.0があります。また、最初はgccが新しすぎたのかもしれないが、gcc-5でも同じ問題が続いていると思われるため、gcc-5をインストールしました。メーリングリストまたは別のフォーラムの誰かが、この問題はgitから直接クローンを作成することで解決されたと述べましたが、それは私のシナリオでも役に立ちませんでした。

他の誰かがこの問題に遭遇したかどうか知りたいのですが、もしそうなら、可能な修正は何ですか?

注:MacのVirtualboxでUbuntuを実行しているのは、それが問題の原因である可能性がある場合です。

11
John Long

問題はgccのインストールにあります。gcc6+バージョンでは、デフォルトでPIE(位置独立実行可能ファイル)が有効になっています。そのため、コンパイルするには、無効にする必要があります。 gcc 5にも問題があります。これはgccの既知のバグです。 バグリンク

これまでのところ、gcc側からの公式パッチはないため、回避策はカーネルソースのMakefileにパッチを適用することです。

ソースファイルのパッチ適用に慣れている場合は、このリンクのコードを使用してパッチファイルを作成し、コンパイルしてみてください。 パッチファイル

パッチのインストールに問題がある場合はお知らせください。

10
Joy

Makefileを開き、CFLAGS_EXTRAを探して、次のオプションを追加します-fno-pie

私はラインを持っていました:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

私はそれを変更しました:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

カーネル4をビルドする場合、上記のフラグはKBUILD_CFLAGSです。

そして、再びコンパイルを開始しました。

4
Natim