いくつかのファイルをリンクしようとしています。これが私のコマンドです:
gcc -T linker.ld -o Stack\ Berry.bin -ffreestanding -O2 -nostlib kernel.o boot.o -fPIC -lgcc
しかし、このエラーが発生します:
/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
-fPIC
引数を含めましたが、間違った場所に配置しただけですか?このフラグの構文については何も見つかりませんでした。ありがとうございます。
コメント
回答
boot.o
には.multiboot
elfセクションがあります。これは-fPIC
。 boot.o
を-fPIC
でコンパイルしようとすると、失敗するはずです。
https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#OS-image-format ヘッダー用。
一方、
。「動的ローダー」があったとしても、起動プロセス中に動的にリンクするものはありません。
コメント
- ヘッダーとフラグ値の情報しか見つかりませんでしたが、boot.sと一致していました。ところで、boot.oはオブジェクトファイルであり、boot.sである必要があるため、コンパイルできません。
- .binを-fPICでコンパイル/リンクすることで何を達成しようとしていますか?
-fPIC
オプションはコンパイルフェーズ(オブジェクトファイルを生成するコマンド)の間に適用する必要があります-あなたが示しているように、リンクフェーズではなくgcc -fPIC -c kernel.c -o kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra