GNU/Linux >> Linux の 問題 >  >> Linux

私のブートローダーは gcc 4.6 と 4.7 でコンパイルできません ... 4.5 のみ

gcc-4.5 の間に、指定したフラグを使用して簡単な C ファイルをコンパイルすることにより、 と gcc-4.6 、および objdump -h を使用 出力を調べると、 .eh_frame のようです セクションは gcc-4.6 で導入されています .

ld あなたが提供したスクリプトはそのセクションを処理しません。おそらくそうすべきです。 strip -R .eh_frame -R .eh_frame_hdr を使用できます リンクする前にオブジェクト ファイルからそのセクションと他のセクションを削除します。

とにかく、リンカは両方の gcc バージョンで同じなので、 objdump -h


<ブロック引用>

より大きなセクションを生成する可能性のある機能をオフにするコマンドライン引数はありますか

はい:サイズが気になる場合は、-Os でビルドする必要があります。 . -O3 明示的に最適化を有効にすると、コード サイズが大きくなる可能性があります。ブートローダは一度実行されるため 、 -O3 を使用 それはほぼ確実に間違っているからです。

編集:

<ブロック引用>

「組み立ての最適化なんて無意味…
...そしてここにある他のオブジェクト..."

すべて アセンブリ内のコードの?もしそうなら、最適化レベルは確かに無意味ですが、 readelf -S vga_pm.S.o からの出力を単純に比較できるはずです 両方のコンパイラでビルドされ、どちらかを正確に確認できます

ただし、一部のオブジェクトはそうでない可能性が高いようです アセンブリで、この場合 -O3 の差 と -Os


GCC は、不要なデバッグ セクションをバイナリ出力に追加します (objdump -h <file> を使用) それらを見るために)、私は通常、必要のないものを /DISCARD/ に入れます それらを取り除くために私のldスクリプトのルール:

/DISCARD/ : {
        *(.debug_*)
        *(.note*)
        *(.indent)
        *(.comment)
        *(.stab)
        *(.stabstr)
        *(.eh_frame)
}

Linux
  1. LvmとDm-cryptでトリミングしますか?

  2. 「でスクリプトを実行します。 」と「ソース」で?

  3. Lsでアンカー^$を使用できますか?

  1. 部分的なパスワードでログインできるのはなぜですか?

  2. VPSとクラウドサーバーで何ができますか?

  3. MySQL が実行されているポートと、接続できるかどうかをテストする方法は?

  1. Clang は GCC でコンパイルされた .a ライブラリでコードをコンパイルできますか?

  2. GCC/LD で RPATH と RUNPATH を設定するには?

  3. コマンドラインのみ(および超軽量)のLinuxのフレーバーは?