3

arm926ej-s のオブジェクト ファイルを作成できました。qemu で
debian arm を使用しています。

arm-linux-gnueabi-gcc-4.4 -static -O -c -mcpu=arm926ej-s  hello.c -o hello
root@at0012-ubuntu:/qemu-deb-squeeze/mnt/package# readelf -A hello
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "ARM926EJ-S"
  Tag_CPU_arch: v5TEJ
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-1
  Tag_FP_arch: VFPv3-D16
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: int
  Tag_ABI_HardFP_use: SP and DP
  Tag_ABI_optimization_goals: Prefer Speed
  Tag_DIV_use: Not allowed

しかし、ubuntu で -c を指定してコンパイルすると、この代わりに armv7 の実行可能ファイルが作成
されます。
$ arm-linux-gnueabi-gcc-4.4 -static -mcpu=arm926ej-s hello.c -o hello を試してみました
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7を作成します

4

1 に答える 1

3

GCC のldは、リンクする正しいライブラリを見つけるために最善を尽くします。私の知る限り、 -mcpu 、 -mthumb 、 -mfpu 、および -mfloat-abi を考慮しています(以下参照)。このリストは完全ではない可能性があります。おそらく-mthumb-interworkも考慮されます。-mcpuが指定されている場合、アーキテクチャはその値から派生します。

したがって、これらのオプションはldに渡す必要があり、 ldが実際に正しい multilib を選択することを確認する必要があります。

これらの各オプションには、正しい方向に導かない可能性のある組み込みのデフォルト値があります。

一致するライブラリが見つからない場合、 ldはデフォルトのライブラリにフォールバックします。エラーメッセージはありません。

したがって、あなたの場合 - -mcpuldに渡し、ツールチェーンのインストールが正しいと仮定すると、一致する multilib がない可能性があり、ldはデフォルトのものを使用します。リンク プロセスは技術的には成功しますが、必要な結果が得られません。


いくつかの例 (arm-none-eabi-gcc 4.6.2)

利用可能なマルチライブラリ:

$ arm-none-eabi-gcc -print-multi-lib
.;
thumb/arm7tdmi-s;@mthumb@mcpu=arm7tdmi-s
thumb/cortex-m0;@mthumb@mcpu=cortex-m0
thumb/cortex-m3;@mthumb@mcpu=cortex-m3
thumb/cortex-m4;@mthumb@mcpu=cortex-m4
thumb/cortex-m4/float-abi-hard/fpuv4-sp-d16;@mthumb@mcpu=cortex-m4@mfloat-abi=hard@mfpu=fpv4-sp-d16

デフォルト

$ arm-none-eabi-gcc -print-multi-directory
.

特定の cpu の multilib が見つからない場合は、デフォルトも使用されます。エラー メッセージは表示されません。

$ arm-none-eabi-gcc -print-multi-directory -mcpu=arm926ej-s 
.

-mcpuが「明らかに」間違っている (つまり、 arm-none-eabi-gcc --target-help で確認できる既知の ARM CPU のリストに cpu が含まれていない)場合でも、エラー メッセージは表示されません。

$ arm-none-eabi-gcc -print-multi-directory -mcpu=xxx
.

-mcpu=cortex-m4を使用しても、無効な multilib が選択されます。cm4 は親指のみをサポートするため、この値は-mcpuから導出できますが、組み込みのデフォルトが優先されます。

$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4
.

cm4 の正しい multlib を取得するには、-mthumbも必要です。これは、命令セットのデフォルト値をオーバーライドするために必要です。

$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4 -mthumb
thumb/cortex-m4

浮動小数点演算のハードウェア サポートを備えた cm4 の正しい multilib を取得するには、-mfpuでは不十分な場合があります。

$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4 -mthumb -mfloat-abi=hard
.

それが必要です

$ arm-none-eabi-gcc -print-multi-directory -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16
thumb/cortex-m4/float-abi-hard/fpuv4-sp-d16

multilib に関する詳細は、こちらとauselenの回答にあります。


auselen が既にコメントしたように、これを解決する最も簡単な方法は、適切なツールチェーンを見つけることです。ARM ツールチェーンの構築は別の話です。

于 2013-05-22T09:27:30.300 に答える