Kernel no es compatible con el modo PIC para la compilación?


14

He estado tratando de compilar el último kernel de Linux v4.8.9 en Ubuntu 16.10 y este error sigue apareciendo después de hacer el .config predeterminado, modificarlo con menuconfig y ejecutar make por sí mismo. También ejecuté make mrproper tan pronto como desmarqué el archivo. Este es el resultado justo después de ejecutar 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

También he intentado compilar con la opción -no-pie después del comando make, pero muestra un conjunto de nuevos errores y dice constantemente que faltan "objetivos". Tengo gcc versión 6.2.0. También tengo instalado gcc-5 porque supuse al principio que podría ser porque gcc era demasiado nuevo, pero el mismo problema persiste en gcc-5. Alguien en las listas de correo u otro foro mencionó que el problema se resolvió clonando directamente desde git, pero eso tampoco ayudó en mi escenario.

Tengo curiosidad por saber si alguien más se ha encontrado con este problema y, de ser así, ¿qué posible solución podría ser?

NOTA: Estoy ejecutando Ubuntu en Virtualbox en una Mac si eso podría ser una posible fuente de problemas.

Respuestas:


13

El problema está en su instalación de gcc, en las versiones de gcc 6+ PIE (ejecutables independientes de la posición) está habilitado de forma predeterminada. Entonces, para compilar necesita deshabilitarlo. Incluso gcc 5 tiene el problema. Este es un error conocido para gcc. Enlace de error .

Hasta ahora no hay un parche oficial desde el lado de gcc, por lo que la solución es parchear el Makefile de la fuente del kernel.

Si está familiarizado con el parcheo del archivo fuente, use los códigos de este enlace para crear el archivo parche y luego intente compilarlo. Archivo de parche

Avíseme si tiene dificultades para instalar el parche.


Soy un novato completo de Linux, ¿cómo haría para instalar el parche en el sitio web? ¿Asumo que copio y pego alguna parte en un archivo y ejecuto un comando?
John Long

1
Desafortunadamente, no tengo suficientes puntos de representación para hacer votos a favor, pero te hice la misma pregunta que acabas de responder en Superusuario y quería preguntarte si preferirías vincular esta respuesta a la pregunta de Superusuario y marcarla como contestada o tú mismo podría responderlo en superusuario. ¡Solo quiero asegurarme de dar crédito donde se debe!
John Long

1
Hola, Ninetainedo, asegúrate de haberlo copiado correctamente y de "De" a "2.8.1".
Alegría

1
@Joy Tuve el mismo error: parchear el archivo Makefile Hunk # 1 FALLÓ en 608. 1 de 1 trozo FALLÓ - al guardar los rechazos al archivo Makefile.rej, el parche termina inesperadamente en el medio de la línea
rainman

1
el parche no funciona para las versiones 2.6.x (lo intenté en 2.6.39) obteniendo esto en mi archivo de rechazo de parche - pastebin.com/Pmdv1MTT ¿ alguna idea?
SatheeshJM

8

Abra el Makefile, busque CFLAGS_EXTRA y agregue la siguiente opción -fno-pie

Tenía la linea:

EXTRA_CFLAGS += $(CFLAGS_EXTRA)

Lo cambié por:

EXTRA_CFLAGS += $(CFLAGS_EXTRA) -fno-pie

Para la construcción del núcleo 4, bandera anterior es: KBUILD_CFLAGS.

Y comenzó a compilar de nuevo.


Esto está funcionando bien
King Stone
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.