9

powerpc mpc8313 プロセッサ ベースのボードで uboot の移植がどのように行われるかを理解しようとしています。この手順の間に、リンカー スクリプト ファイルである uboot.lds というファイルに出くわしました。

このファイルを理解する必要があります。言及されている内容の重要性と、実際のアドレスが uboot パッケージで定義されている場所を意味します。

例えば; セクションでは、次の情報の重要性を見つけることができます。

/* Read-only sections, merged into text segment: */
. = + SIZEOF_HEADERS;
.interp : { *(.interp) }
.hash          : { *(.hash)  }
.dynsym        : { *(.dynsym)  }
.dynstr        : { *(.dynstr)  }
.rel.text      : { *(.rel.text)  }
.rela.text     : { *(.rela.text)  }
.rel.data      : { *(.rel.data)  }
.rela.data     : { *(.rela.data)  }
.rel.rodata    : { *(.rel.rodata)  }
.rela.rodata   : { *(.rela.rodata)  }
.rel.got       : { *(.rel.got)  }
.rela.got      : { *(.rela.got)  }
.rel.ctors     : { *(.rel.ctors) }
.rela.ctors    : { *(.rela.ctors) }
.rel.dtors     : { *(.rel.dtors) }
.rela.dtors    : { *(.rela.dtors) }
.rel.bss       : { *(.rel.bss)  }
.rela.bss      : { *(.rela.bss)  }
.rel.plt       : { *(.rel.plt)  }
.rela.plt      : { *(.rela.plt)  }
.init          : { *(.init) }
.plt : { *(.plt) }
.text      :
{
  cpu/mpc83xx/start.o (.text)
  *(.text)
  *(.fixup)
  *(.got1)
  . = ALIGN(16);
  *(.rodata)
  *(.rodata1)
  *(.rodata.str1.4)
  *(.eh_frame)
}
.fini      : { *(.fini)    } =0
.ctors     : { *(.ctors)   }
.dtors     : { *(.dtors)   }

/* Read-write section, merged into data segment: */
. = (. + 0x0FFF) & 0xFFFFF000;
_erotext = .;
PROVIDE (erotext = .);
.reloc   :
{
  *(.got)
  _GOT2_TABLE_ = .;
  *(.got2)
  _FIXUP_TABLE_ = .;
  *(.fixup)
}
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2;
__fixup_entries = (. - _FIXUP_TABLE_) >> 2;

.data    :
{
  *(.data)
  *(.data1)
  *(.sdata)
  *(.sdata2)
  *(.dynamic)
  CONSTRUCTORS
}
_edata  =  .;
PROVIDE (edata = .);

. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;


. = .;
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;

. = ALIGN(4096);
__init_begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(4096);
__init_end = .;

__bss_start = .;
.bss       :
{
 *(.sbss) *(.scommon)
 *(.dynbss)
 *(.bss)
 *(COMMON)
}
_end = . ;
PROVIDE (end = .);
}

この情報を探す場所と、lds ファイルで行われる変更を特定する方法は?

確認するか、少なくとも情報を読むためのいくつかの指針を与えてください、ありがとう

よろしく、ビジェイ

4

1 に答える 1

17

u-boot を移植するには、u-boot.lds をおそらくボード ディレクトリではなく cpu ディレクトリから使用できます。つまり、おそらくこのファイルを移植する必要はありません。ただし、ある場合は、概要を以下に示します。

LDのドキュメントには多くの情報があります。

一般に、LD スクリプトでできることは、実行時に GCC ツール チェーンがメモリ内に配置するデフォルトの場所をオーバーライドすることです。アプリケーションをコンパイルすると、ソース コードが処理され、マシン コードを含むオブジェクト コード ファイルが作成されます。リンク中に、さまざまなオブジェクト ファイルが 1 つのファイル (たとえば、ELF 実行可能ファイル) に結合され、必要なときに見つけることができるように、各オブジェクト ファイルをメモリ内のどこに配置する必要があるかを OS に伝えるヘッダーがファイルに配置されます (グローバル、関数通話など)

コンパイラ/リンカーが推測できない特定の場所にコードを配置する場合は、カスタム スクリプトが必要です。これを行う理由はたくさんあるので、リストしてみます。

  1. RAMがまばらな場合、定数は読み取り専用メモリに配置される場合があります
  2. 頻繁にアクセスされるメモリは、可能であればより高速な RAM に配置する必要がある場合があります
  3. 一部のデータは、64K などの特定の境界で整列する必要がある場合があります。
  4. 一部のコード (.TEXT) は、リセット時に実行されるように、リセット ベクターに配置する必要があります。
  5. ISR コード ベクトルも同様

これに加えて、リンク時にメモリ ポインタへの便利なアクセスを取得する方法にもなります。たとえば、__init_begin は、*.text.init としてコンパイルされたコードのメモリ アドレスを持つシンボルとして定義されます。完全な C 環境を構成しなくても、プログラム カウンターを __init_begin の値に設定することで、そのメモリを呼び出すことができるようになりました。

コンパイラのドキュメント + u-boot Makefile では、コンパイラが各タイプのオブジェクト ファイルをいつ、どのように生成するかを説明する必要があります (例: .txt、.data、.bss、.fini、.ctors など)。

于 2011-06-23T21:28:34.920 に答える