2

arm debian マシン (raspberry pi) で単純な C プログラムをリンクしようとしていますが、ogject ファイルをリンクすると、リンカが件名にエラーを返します。

私のプログラムは次のように単純です

simple.c:

 int main(){
   int a = 2;
   int b = 3;
   int c = a+b;
 }

私はそれをコンパイルします

$>gcc -o simple.obj simple.c

そしてそれをリンクします

$>ld -o simple.elf simple.obj
ld: simple.obj: access beyond end of merged section (33872)

理由がわかりません... elfファイルを読み込もうとするとobjdump -d、セクションを逆コンパイルできません.text(アドレス、値、.wordおよび0xが前にある値のみを出力します)が、バイナリデータは逆コンパイルされたものから取得したものsimple.obj

唯一の違いは、バイナリ データの読み込み開始 (および結果の) アドレスです。elf ファイルは 0x8280 から始まり、オブジェクト ファイルは 0x82a0 から始まります。

これはどういう意味ですか?

編集:

これは obj ファイルのダンプです: http://pastebin.com/YZ94kRk4

これは elf ファイルのダンプです: http://pastebin.com/3C3sWqrC

アセンブリ時間後にgccを停止させる-cオプションでコンパイルしようとしましたが(リンク部分はすでに実行されています)、別の問題があります:オブジェクトファイルに_startセクションがないと言われています...

新しいダンプは次のとおりです。

simple.obj: http://pastebin.com/t0TqmgPa

simple.elf: http://pastebin.com/qD35cnqw

4

2 に答える 2

2

実行したコマンドの効果を誤解しています。実行する場合:

$ gcc -o simple.obj simple.c

実行したいプログラムがすでに作成されており、すでにリンクされています。ld特に何をしているのかわからない限り、直接実行することにより、再度リンクする必要はありません。拡張子が obj であっても問題ありません。ファイルの名前だけですが、ファイルの内容は既に完全な Linux プログラムです。したがって、実行すると:

$ ./simple.obj

それはあなたのコードを実行します。

通常、直接呼び出すことはありませんldが、代わりにgccフロントエンドとして使用してコンパイルおよびリンクします。これはgcc、スタートアップ コードなど、リンクしていない重要なライブラリのリンクも処理するためです。これが、2 回目の試行で「_startセクションがありません」などの結果になった理由です。

于 2013-11-24T13:15:40.777 に答える
0

objdump -dコマンドの出力を印刷できますか?

ところで、注意して33872 == 0x8450ください。

私はラズベリー PI のメモリ マップに精通していないので、これに関するチュートリアルに従っている場合、または私があなたを助けるのに役立つ他のリソースがある場合は、それは素晴らしいことです :)

于 2013-11-08T22:22:40.440 に答える