2016-11-04 13 views
1

.textセクションを.globl _startとして定義しているRISCV用の起動アセンブリがあります。_startシンボルはどこに定義されていますか

私はこれが何であるかを知っています。逆アセンブリは私にアドレスを示していますが、定義されている場所はわかりません。リンカースクリプトにはありません。ビルドディレクトリのgrepはさまざまなバイナリファイルに含まれていることを示していますが、定義が見つかりません。

私はこれがファイルのどこかにアーキテクチャの機能として表示されていると推測していますが、誰にでもどこに教えてもらえますか? (これは、すべてのLinux上でRISCV GNUクロスコンパイラを使用して構築されている)

+0

この質問に対する回答には、リンカー、ローダー、およびスタートアップコードの内部の詳細が含まれます。別の言い方をすると、実行時に '_start'のアドレスが割り当てられるので、' grep'を見つけるための定義はありません。 – user3386109

+0

私のベアメタルプロジェクトでは、リンカスクリプトの固定アドレスに '_start'を割り当てます。それ以外の場合、 '_start'が正しい場所にあることを保証することはできません。 – fsasm

+1

'.start'という行は、' .globl _start'指示文と同じソースコードファイル内の '_start'というラベルを定義する行でなければなりません。そうでなければ' .globl _start'指示文は何も役に立ちません。 –

答えて

1

あなたがそれを自分で制御しない限り、少なくともGNUツールの世界にはcrt0.sというファイルがあります。あるいは、おそらく他の名前。アセンブリ言語であるため、アーキテクチャごとに1つである必要があります。

これはCライブラリ(glibc、newlibなど)の一部であるかどうか、またそれが後で人によって追加されるかどうかはわかりません。これはデフォルトのブートストラップです。特定のプラットフォームをターゲットにしたツールチェーンを構築する

必ずしも必要ではありませんが、_startがバイナリの先頭のラベルであることは珍しくありませんが、それは確実にエントリポイントとされています。したがって、ラベル付きのバイナリ(elfなど)を使用するオペレーティングシステム/ローダがある場合、バイナリをロードすることができ、最初のアドレスに分岐する代わりにエントリポイントに分岐します。

+0

事実、私はこれを(他の人々のビットを一緒にハックすることによって)自分自身のcrt.Sを書きました。 _startは、エントリコードのロード先として定義されていることがわかりました。 – adrianmcmenamin

0

ので_startは単に.textセクションの先頭にあるものとして定義され、.textセクションのアドレスは、リンカスクリプトで定義されています。

関連する問題