O kernel não suporta o modo PIC para compilar?


14

Eu tenho tentado compilar o kernel mais recente do Linux v4.8.9 no Ubuntu 16.10 e esse erro continua aparecendo após eu ter feito o .config padrão, modificado com menuconfig e executado o make sozinho. Também executei o make mrproper assim que descompactou o arquivo. Esta é a saída logo após a execução do 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

Também tentei compilar com a opção -no-pie após o comando make, mas ele gera um conjunto de novos erros, constantemente dizendo que existem "destinos ausentes". Eu tenho a versão 6.2.0 do gcc. Eu também tenho o gcc-5 instalado, porque eu assumi que no início poderia ser porque o gcc era muito novo, mas o mesmo problema persiste no gcc-5. Alguém nas listas de discussão ou outro fórum mencionou que o problema foi resolvido pela clonagem direta do git, mas isso também não ajudou no meu cenário.

Estou curioso para saber se alguém já se deparou com esse problema. Em caso afirmativo, que solução pode ser essa?

NOTA: Estou executando o Ubuntu no Virtualbox em um Mac, se isso puder ser uma possível fonte de problemas.

Respostas:


13

O problema está na instalação do gcc. Nas versões do gcc 6+, o PIE (executáveis ​​independentes da posição) está ativado por padrão. Portanto, para compilar, você precisa desativá-lo. Até o gcc 5 tem o problema. Este é um bug conhecido pelo gcc. Bug Link .

Até o momento não há nenhum patch oficial do lado do gcc, portanto a solução alternativa é corrigir o Makefile da fonte do kernel.

Se você estiver familiarizado com a correção do arquivo de origem, use os códigos deste link para criar o arquivo de correção e tente compilar. Arquivo de Patch

Deixe-me saber se você está tendo dificuldades para instalar o patch.


Eu sou um completo linux noob, como eu instalaria o patch no site fornecido? Eu suponho que copiei e colei alguma parte em um arquivo e execute um comando?
John Long

1
Infelizmente, não tenho pontos de representação suficientes para fazer upvotes, mas fiz a mesma pergunta que você acabou de responder no Superusuário e queria perguntar se você preferir. Vinculo essa resposta à pergunta do Superusuário e marque-a como respondida ou você mesmo poderia respondê-lo no superusuário. Só quero ter certeza de dar crédito onde o crédito é devido!
John Long

1
Olá Ninetainedo, certifique-se de que copiou corretamente e copiou apenas de "De" para "2.8.1".
Joy

1
@Joy Eu tive o mesmo erro: Arquivo remendar Makefile Hunk # 1 falhou em 608. 1 de 1 pedaço FALHA - poupando rejeita arquivo de patch Makefile.rej inesperadamente termina no meio da linha
rainman

1
o patch não funciona nas versões 2.6.x (tentei no 2.6.39), obtendo isso no meu arquivo de rejeição de patch - pastebin.com/Pmdv1MTT alguma idéia?
precisa saber é o seguinte

8

Abra o Makefile, procure CFLAGS_EXTRA e adicione a seguinte opção -fno-pie

Eu tinha a linha:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Eu mudei para:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Para a construção do kernel 4, bandeira acima é: KBUILD_CFLAGS.

E começou a compilar novamente.


Isso está funcionando bem
King Stone
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.