Estoy tratando de vincular algunos archivos. Aquí está mi comando:

gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc 

Sin embargo, aparece este error:

/usr/bin/ld: boot.o: relocation R_X86_64_32 against `.multiboot" can not be used when making a PIE object; recompile with -fPIC /usr/bin/ld: final link failed: Nonrepresentable section on output 

He incluido el argumento -fPIC, ¿lo he puesto en el lugar equivocado? No he podido encontrar nada para la sintaxis de esta bandera. ¡Gracias!

Comentarios

  • El -fPIC La opción debe aplicarse durante la fase de compilación (el comando que genera los archivos de objeto) creo, en lugar de la fase de enlace, como está mostrando
  • No ' No parece funcionar. Lo intenté compilando el código GAS (no un arg) y el comando que genera el archivo de objeto. No parece funcionar. gcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra
  • (1) Mi primera suposición (y es solo una suposición) fue que se trataba de un problema de orden en la línea de comandos. ¿Ha intentado cambiar el orden del comando? (2) Leer el error «recompilar con -fPIC» me hace dudar de mi primera suposición y creer que @steeldriver tiene la idea correcta.… (Continuación)
  • (Continuación)… (3) La gente dirá que esta pregunta está fuera de tema aquí y pertenece a Stack Overflow . Creo que está en el tema aquí, pero Estoy de acuerdo en que es probable que obtenga una respuesta más rápida y precisa en Stack Overflow . Si no obtiene una respuesta aquí y la pregunta no se migra, le sugiero que la marque y solicite que la muevan. Por favor, no vuelva a publicar la pregunta.
  • Sí, he intentado cambiar el orden.

Responder

Su boot.o tiene una .multiboot sección elf, que es incompatible con -fPIC. Puede intentar compilar boot.o con -fPIC pero debería fallar.

Consulte https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format para el encabezado.

Por otro lado, no tiene mucho sentido crear un objeto de arranque con -fPIC. Incluso si hubiera un «cargador dinámico», «no puede haber nada con lo que vincular dinámicamente durante el proceso de arranque.

Comentarios

  • Solo pude encontrar información en el encabezado y el valor de la bandera, y coincidió con mi boot.s. Por cierto, boot.o es un archivo de objeto, no compilable, como debería ser boot.s.
  • ¿Qué está tratando de lograr compilando / enlazando su .bin con -fPIC?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *