Sto cercando di collegare alcuni file. Ecco il mio comando:

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

Tuttavia, ottengo questo errore:

/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 

Ho incluso largomento -fPIC, lho appena messo nel posto sbagliato? Non sono riuscito a trovare nulla per la sintassi di questo flag. Grazie!

Commenti

  • Il -fPIC lopzione deve essere applicata durante la fase di compilazione (il comando che genera i file oggetto) penso – piuttosto che la fase di collegamento, come stai mostrando
  • Non ' sembra funzionare. Ho provato a compilare il codice GAS (non un arg) e il comando che genera il file oggetto. Non sembra funzionare. gcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra
  • (1) La mia prima ipotesi (ed è solo unipotesi) è stata che si tratti di un problema di ordine della riga di comando. Hai provato a cambiare lordine del comando riga? (2) In realtà la lettura dellerrore “ricompila con -fPIC” mi fa dubitare della mia prima ipotesi e credo che @steeldriver abbia lidea giusta. … (Continua)
  • (Continua) … (3) Le persone diranno che questa domanda è fuori tema qui e appartiene a Stack Overflow . Credo che sia in argomento qui, ma Concordo sul fatto che probabilmente riceverà una risposta più rapida e accurata su Stack Overflow . Se non ottieni una risposta qui e la domanda non viene migrata, ti suggerisco di contrassegnarla e chiedere di spostarla. Per favore, non limitarti a ripubblicare la domanda.
  • Sì, ho provato a cambiare lordine.

Risposta

La tua boot.o ha una .multiboot sezione elf, che non è compatibile con -fPIC. Puoi provare a compilare boot.o con -fPIC ma dovrebbe fallire.

Vedi https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format per lintestazione.

Daltra parte, ha poco senso creare un oggetto avviabile con -fPIC. Anche se fosse presente un “caricatore dinamico”, non può “esserci nulla a cui collegarsi dinamicamente durante il processo di avvio.

Commenti

  • Sono riuscito a trovare solo informazioni sullintestazione e sul valore del flag, e corrispondeva al mio boot.s. A proposito, boot.o è un file oggetto, non compilabile, come dovrebbe essere boot.s.
  • Cosa stai cercando di ottenere compilando / collegando il tuo .bin con -fPIC?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *