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
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?
-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á mostrandogcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra