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와 관련하여 귀하가 나열한 두 번째 오류 세트를 받았습니다. 나는 이것이 소프트웨어의 버그라고 생각하지만, 내가 찾은 해결책은 소스 파일 중 하나에 두 줄을 추가하여 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 기사.

관련 정보