Linuxカーネルをコンパイルできません。

Linuxカーネルをコンパイルできません。

Linux Mint 17.3でカーネルを4.5にアップグレードしようとすると、次のエラーが発生します。

Makefile:666: Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong not supported by compiler

  LD      /var/lib/dkms/ndiswrapper/1.59/build/built-in.o
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/crt_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/hal_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/ndis_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/ntoskernel_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/ntoskernel_io_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/rtl_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/usb_exports.h
  MKSTUBS /var/lib/dkms/ndiswrapper/1.59/build/win2lin_stubs.h
  CC [M]  /var/lib/dkms/ndiswrapper/1.59/build/crt.o

gcc: error: unrecognized command line option ‘-fstack-protector-strong’
make[1]: *** [/var/lib/dkms/ndiswrapper/1.59/build/crt.o] Error 1
make: *** [_module_/var/lib/dkms/ndiswrapper/1.59/build] Error 2
make: Leaving directory `/usr/src/linux-headers-4.5.0-040500-generic'

GCCバージョン4.8.4があります。

以下はgccを4.9にアップグレードした後に発生したエラーです。どこかでこれがバグだと読んだことがありますか?

DKMS make.log for ndiswrapper-1.59 for kernel 4.5.0-040500-generic (x86_64)

make: Entering directory `/usr/src/linux-headers-4.5.0-040500-generic'
  LD      /var/lib/dkms/ndiswrapper/1.59/build/built-in.o
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/crt_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/hal_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/ndis_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/ntoskernel_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/ntoskernel_io_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/rtl_exports.h
  MKEXPORT /var/lib/dkms/ndiswrapper/1.59/build/usb_exports.h
  MKSTUBS /var/lib/dkms/ndiswrapper/1.59/build/win2lin_stubs.h
  CC [M]  /var/lib/dkms/ndiswrapper/1.59/build/crt.o
  CC [M]  /var/lib/dkms/ndiswrapper/1.59/build/hal.o
  CC [M]  /var/lib/dkms/ndiswrapper/1.59/build/iw_ndis.o
  CC [M]  /var/lib/dkms/ndiswrapper/1.59/build/loader.o
/var/lib/dkms/ndiswrapper/1.59/build/loader.c: In function ‘load_sys_files’:
/var/lib/dkms/ndiswrapper/1.59/build/loader.c:157:4: error: implicit declaration of function ‘__vmalloc’ [-Werror=implicit-function-declaration]
    __vmalloc(load_driver->sys_files[i].size,
    ^
/var/lib/dkms/ndiswrapper/1.59/build/loader.c:156:19: warning: assignment makes pointer from integer without a cast
   pe_image->image =
                   ^
/var/lib/dkms/ndiswrapper/1.59/build/loader.c:207:5: error: implicit declaration of function ‘vfree’ [-Werror=implicit-function-declaration]
     vfree(driver->pe_images[i].image);
     ^
/var/lib/dkms/ndiswrapper/1.59/build/loader.c: In function ‘add_bin_file’:
/var/lib/dkms/ndiswrapper/1.59/build/loader.c:298:2: error: implicit declaration of function ‘vmalloc’ [-Werror=implicit-function-declaration]
  bin_file->data = vmalloc(driver_file->size);
  ^
/var/lib/dkms/ndiswrapper/1.59/build/loader.c:298:17: warning: assignment makes pointer from integer without a cast
  bin_file->data = vmalloc(driver_file->size);
                 ^
/var/lib/dkms/ndiswrapper/1.59/build/loader.c: In function ‘wrapper_ioctl’:
/var/lib/dkms/ndiswrapper/1.59/build/loader.c:789:15: warning: assignment makes pointer from integer without a cast
   load_driver = vmalloc(sizeof(*load_driver));
               ^
/var/lib/dkms/ndiswrapper/1.59/build/loader.c: In function ‘wrapper_ioctl_compat’:
/var/lib/dkms/ndiswrapper/1.59/build/loader.c:884:11: warning: assignment makes pointer from integer without a cast
   kdriver = vmalloc(sizeof(*kdriver));
           ^
cc1: some warnings being treated as errors
make[1]: *** [/var/lib/dkms/ndiswrapper/1.59/build/loader.o] Error 1
make: *** [_module_/var/lib/dkms/ndiswrapper/1.59/build] Error 2
make: Leaving directory `/usr/src/linux-headers-4.5.0-040500-generic'

答え1

それでも応答を探しているかどうかはわかりませんが、4.5.3カーネルにアップグレードしようとしたときに同じ問題が発生しました。私のシステムにgcc-5がインストールされていることを発見し、それを使って切り替えると、最初の問題(-fstack-protector-strong)が修正されました。その後、ndiswrapper / 1.59に関してあなたがリストした2番目のエラーセットを受け取りました。私はこれがソフトウェアのバグだと思いますが、私が見つけた解決策は、ソースファイルの1つに2行を追加してndiswrapperコードを修正することでした。これにより、正常にコンパイルできます。次の行を#include "ndiswrapper.h"既存の行の前に追加します/usr/src/ndiswrapper-1.59/loader.h

#define strnicmp strncasecmp // ndis.c fails to compile without this
#include <linux/vmalloc.h>   // loader.c fails to compile without this

または、更新するための簡単なスクリプトは次のとおりです(正しく切り取り/貼り付けた場合)。

if ! grep -q strncasecmp /usr/src/ndiswrapper-1.59/loader.h; then
  sed -i -e '/ndiswrapper.h/i \
#define strnicmp strncasecmp \
#include <linux/vmalloc.h>' /usr/src/ndiswrapper-1.59/loader.h
fi

答え2

CONFIG_CC_STACKPROTECTOR_STRONGバージョン3.14に追加されたカーネル構成オプション。-fstack-protector-strongこれを使用してビルドするには、GCC 4.9が必要です。 GCCを4.9にアップグレードするか、ビルドカーネルの使用を中止する必要がありますCONFIG_CC_STACKPROTECTOR_STRONG(電子が良い)。以下はいくつかの背景情報です。このLWN記事

関連情報