8

ARMboot (Uboot および PPCboot と非常によく似ています)に基づくブートローダーを含む組み込みハードウェア システムがあります。

このブートローダは通常、フラッシュから uClinux イメージをロードする役割を果たします。ただし、現在、このブートローダーを使用して、リンクされたライブラリを必要としないスタンドアロンの helloworld アプリケーションを実行しようとしています。実際にwhile(1){}は、メイン関数のコードのみが含まれています。

私の問題は、スタンドアロンの適切にフォーマットされたバイナリをビルドするために使用すべき GCC 設定が見つからないことです。

私は次のビルドコマンドを使用します:

cr16-elf-gcc -o helloworld helloworld.c -nostdlib

これにより、警告メッセージが生成されます:
警告: エントリ シンボル _start が見つかりません。デフォルトは 00000004

その後、ブートローダー内で、生成されたアプリケーションをアップロードし、次のアドレスで開始します。

tftpboot 0xa00000 helloworld
go 0xa00004

しかし、それは機能しません:(システムが再起動します。

通常、ハングするはずです( のためwhile(1))。

4

4 に答える 4

5

そのローダーはわかりませんが、このようなobjcopyを使用して、実行可能データを生のバイナリファイルにダンプする必要があると思います。ELFヘッダーにジャンプしないでください、人々:)

objcopy -O binary ./a.out o.bin

また、位置に依存しないコードをコンパイルし、ldおよびgccのマニュアルを読んでみてください。

于 2010-01-08T13:39:52.900 に答える
4

リンカは、スタートアップ コードの欠落について不平を言っています。

スタートアップ コードと、ターゲット プロセッサのアドレス マップを定義するリンカー コマンド ファイルの 2 つを提供する必要があります。

あなたの場合、スタートアップコードは「bl main」ですが、通常、スタートアップコードは、少なくともメインに分岐する前にスタックポインターを初期化します。

サンプルを RAM にロードすることがわかっている場合は、プログラムを main で直接開始できます。「go」コマンドに使用する main() のアドレスを決定する必要があります。

于 2010-01-08T12:52:23.563 に答える
1

私は毎日、ARM non-os non-lib を一日中操作しています。これは私の現在のgccオプションです:

arm-whatever-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -c hello.c -o hello.o

次に、リンカーを使用して、C コードとベクター テーブルなどを組み合わせます。ベクター テーブルを使用するイメージでなくても、ベクター テーブルを使用すると、最初の命令にエントリ ポイントを簡単に配置できます。

于 2010-01-08T19:22:43.497 に答える
0

少なくとも標準ライブラリを静的にリンクできない理由はありますか?動作するプログラムと、外部依存関係のない標準ライブラリの利点が必要です。

また、ツールチェーン/ IDEは「スタンドアロンアプリケーション」と「Linuxアプリケーション」を区別しますか?AVR32用のIDEにはそのような違いがあり、組み込みLinux環境内で実行されるプログラム、または基本的にOSになるスタンドアロンプ​​ログラムのいずれかを生成できます。

于 2010-01-08T14:14:09.500 に答える