gcc
私は4.5の debian スクイーズ/安定版で 2 年前にブートローダーを作成しました。現在、debian では wheezy/sid を 4.6 および 4.7 でコンパイルできません。これは、最終的なバイナリを手動で生成することを期待して、これらからより大きなセクションを作成するためです。debian wheezy/sid には 4.5 がまだ残っているので、これは今のところ問題ではありませんが、 4.6 と 4.7gcc
でコンパイルできるようにしたいと考えています。gcc
次のような最終的なバイナリを生成します。
ソース ファイルは次のようにコンパイルされます。
gcc-4.5 -Wall -O3 -c -m32 -I. -o assemblybin-objects/vga_pm.S.o vga_pm.S
とリンク:
ld -nostdlib -T binary.ld assemblybin-objects/vga_pm.S.o ... and other objects here ... -o bootloader.bin
の内容binary.ld
は次のとおりです。
OUTPUT_FORMAT("binary","binary","binary")
OUTPUT_ARCH(i386)
SECTIONS
{
. = 0;
.bootloader : {
. = 0x600;
*(.bootstrap);
. = 0x7fa;
BYTE(0x11);
BYTE(0x33);
BYTE(0x55);
BYTE(0x77);
BYTE(0x55);
BYTE(0xaa);
_bootstrap_end = .;
. = 0x800;
*(.sysinit);
_sysinit_end = .;
. = 0x1000;
*(.pages);
_pages_end = .;
. = 0x5000;
*(.sysconf);
*(.presystem);
*(.system);
*(.library);
*(.text);
*(.data);
*(.bss);
*(.rodata);
*(.rodata.*);
. = 0xeffc;
BYTE(0x11);
BYTE(0x33);
BYTE(0x55);
BYTE(0x77);
_system_end = .;
}
. = ASSERT(_bootstrap_end <= 0x800,"Bootstrap section big!");
. = ASSERT(_sysinit_end <= 0x1000,"Sysinit section big!");
. = ASSERT(_pages_end <= 0x5000,"Pages section big!");
. = ASSERT(_system_end <= 0xf000,"System initialization section big!");
}
で最終的なバイナリを作成しdd
ます。
4.6 および 4.7でコンパイルするgcc
と、リンカがbootloader.bin
.
私は2.22 以降を使用しており、ビルド プロセスには独自のレシピをld
使用しています。binutils
私の実際の質問は次のとおりです。
これらのバージョンのコンパイラの違いは何ですか?gcc
また、より大きなセクションを生成したり、elf オブジェクト ファイルを介してリンカにこれらのバイトをbootloader.bin
ファイルの先頭に追加するように指示したりしますか?
gcc
4.5よりも大きなセクションを生成する可能性がある機能をオフにしgcc
たり、ファイルの先頭にこれらのバイトを追加するようリンカーに指示する指示を削除したりする、 4.6 および/または 4.7のコマンド ライン引数はありbootloader.bin
ますか?
edit 17-08-2012: 私は最近少し忙しいですが、すぐに私が行ったテストの結果を更新します.
bootloader.bin
@strnkと@Dan Aloni への回答: この問題を見たとき、最初に行ったのは、役に立たないセクションを除外することでしたが、結果は同じです。セクション名、再配置、デバッグ情報、およびシンボルなしで、リンカが指示したとおりの正しい位置...bootloader.bin
ファイルはelfオブジェクトファイルではありません。
実際の質問の変更を検討してください。いつもありがとう...すぐに戻ってきます
2012 年 8 月 31 日編集: わかりました皆さん、ご協力ありがとうございます。@Dan Aloni によって与えられ、@ ldscript
strnk が示すように達成された答え
/DISCARD/ : {
*(.eh_frame)
*(.eh_frame_hdr)
}
アサートの後。