커널은 컴파일을 위해 PIC 모드를 지원하지 않습니까?


14

우분투 16.10에서 최신 Linux v4.8.9 커널을 컴파일하려고 시도했지만 기본 .config를 만들고 menuconfig로 수정하고 자체적으로 실행 한 후에도이 오류가 계속 나타납니다. 또한 파일의 압축을 해제하자마자 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를 실행 중일 수 있습니다. 문제의 원인 일 수 있습니다.

답변:


14

문제는 gcc 설치와 관련이 있으며 gcc 6+ 버전에서는 기본적으로 PIE (위치 독립적 실행 파일)가 활성화되어 있습니다. 따라서 컴파일하려면 비활성화해야합니다. gcc 5조차도 문제가 있습니다. 이것은 gcc의 알려진 버그입니다. 버그 링크 .

지금까지 gcc 측의 공식 패치가 없으므로 해결 방법은 커널 소스의 Makefile을 패치하는 것입니다.

소스 파일 패치에 익숙한 경우이 링크의 코드를 사용하여 패치 파일을 작성한 다음 컴파일하십시오. 패치 파일

패치 설치에 어려움이 있으면 알려주십시오.


나는 완전한 리눅스 멍청한 놈인데, 주어진 웹 사이트에 패치를 설치하는 방법은 무엇입니까? 일부를 복사하여 파일에 붙여 넣고 명령을 실행한다고 가정합니까?
존 롱

1
불행히도, 유권자 투표를 할 충분한 담당자가 없지만 수퍼 유저에게 방금 답변 한 것과 동일한 질문을했으며이 답변을 수퍼 유저 질문에 연결하여 답변으로 표시할지 아니면 본인으로 표시 할지를 묻고 싶었습니다. 수퍼 유저에서 응답 할 수 있습니다. 신용이 필요한 곳에서 신용을주고 싶다!
John Long

1
안녕하세요 Ninetainedo, 올바르게 복사하고 "보낸 사람"에서 "2.8.1"로만 복사했는지 확인하십시오.
Joy

1
@Joy 같은 오류가 발생했습니다 : 패치 파일 Makefile Hunk # 1 FAILED가 608로 설정되었습니다. 1 Hunk FAILED 중 1 개-Makefile.rej 패치에 대한 거부 저장이 예기치 않게 줄 중간에 종료
rainman

1
- 패치의 2.6.x 버전 (내가 2.6.39에서 재판) 파일을 거부 내 패치에서 이것을 얻기를 위해 작동하지 않습니다 pastebin.com/Pmdv1MTT 어떤 아이디어?
SatheeshJM

8

Makefile을 열고 CFLAGS_EXTRA를 찾아 다음 옵션을 추가하십시오. -fno-pie

나는 줄을 가졌다.

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

나는 그것을 위해 그것을 바꿨다 :

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

커널 4를 빌드 할 때 위의 플래그는 다음과 같습니다 KBUILD_CFLAGS.

그리고 다시 컴파일하기 시작했습니다.


이것은 잘 작동
왕 스톤
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.