28

リンカースクリプトが機能しています。内容がファイルから直接プルされる別のデータセクションを追加したい(ldはそれを解析してセクションを抽出するべきではないなど)。どうやってやるの?

OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
SECTIONS
{
  .text 0x100000 : {
    *(.multiboot)
    *(.text)
    *(.code)
    *(.rodata*)
  }
  .data : {
    *(.data)
  }
  .bss : {
    *(.bss)
  }
  kernel_end = .;
  roottask_start = .;
  .data : {

    HERE I WANT TO INCLUDE THE ENTIRE CONTENTS OF ANOTHER (BINARY) FILE

  }
  roottask_end = .;
}
4

4 に答える 4

22

を使用objcopyして、リンクできる通常のオブジェクトに変換し、通常のオブジェクトと同じようにリンカー スクリプトでそのシンボルを参照することができます。objcopyマニュアルページから:

-B bfdarch --binary-architecture=bfdarch 生のバイナリ入力ファイルをオブジェクト ファイルに変換するときに役立ちます。この場合、出力アーキテクチャを bfdarch に設定できます。入力ファイルに既知の bfdarch がある場合、このオプションは無視されます。変換プロセスによって作成された特殊なシンボルを参照することにより、プログラム内でこのバイナリ データにアクセスできます。これらの記号は_binary_objfile_start、 、_binary_objfile_endと 呼ばれ_binary_objfile_sizeます。たとえば、画像ファイルをオブジェクト ファイルに変換し、これらのシンボルを使用してコード内でアクセスできます。

...ここで、objfileは入力オブジェクト ファイルの名前に展開されます。

--rename-sectionオプションも参照してください。

于 2008-11-29T23:01:47.393 に答える
13

生ファイルをアセンブリの別のセクションに配置し、このセクションをリンカー スクリプトに含めることができます。

まず、テンプレート .S ファイルを作成する必要があります。

.section .rawdata
.incbin "blob1.raw"

...そしてリンカースクリプトを変更して、好きなようにこのセクションを含めます。

.data : {

    *(.rawdata*)

}

.S テンプレートに関するもう少し詳細な情報については、こちらを参照することもできます。

于 2013-08-27T13:52:21.853 に答える
6

BYTEもう 1 つの解決策は、関数を使用してバイナリからのバイトを含む 2 番目のリンカー スクリプトを生成し、INCLUDEディレクティブを使用して前のリンカー スクリプトに含めることです。

hexdump次の方法で、バイナリ ファイルからスクリプトを生成できます。

cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld

そして、このように含めます:

SECTIONS {
    .text : {

        /* ... */

        kramelfs = .;
        INCLUDE "ramelfs.ld" ;
        kramelfs_end = .;

       /* ... */
    }
}
于 2011-12-15T09:13:45.010 に答える
1
リンカーだけを使用する別の方法は、TARGET と INPUT を使用することです。

    TARGET(バイナリ)
    入力 (./my_binary_data.bin)
    入力 (./my_binary_code.bin)
    # 必要に応じてここにバイナリ ファイルを追加します
    
    OUTPUT_FORMAT("elf32-i386")
    
    エントリー(スタート)
    
    セクション
    {
        .text 0x100000: {
            *(.マルチブート)
            *(。文章)
            *(。コード)
            ./my_binary_code.bin
            *(.rodata*)
        }
        。データ : {
            *(。データ)
        }
        .bss: {
            *(.bss)
        }
        カーネルエンド = .;
        roottask_start = .;
        。データ : {
    
            ./my_binary_data.bin
    
        }
        roottask_end = .;
    }

于 2021-11-01T18:29:35.283 に答える