2017-11-03 5 views
0

現在、私はRISC-Vを学習しており、RISC-Vツールチェーンを使用しています。私は、例を書いて、オペコードを見るためにコンパイルします。riscv/gcc/ld - リンク先のスクリプトを使用した "未定義のprintfへの参照"

例:

#include <stdio.h> //float.c 

int main() 
{ 
float a=1.04; 
printf("a=%f\n",a); 
return 0; 
} 

私の手順は次のとおりです。

1. riscv64-unknown-elf-gcc -S float.c  *//generate assembly code* 

2. riscv64-unknown-elf-as float.s -o float.o  *//generate obj file* 

3. riscv64-unknown-elf-ld -T elf64lriscv1.x float.o *//use own script to link, -T is using other script* 

し、その後、それは「float.cを:(表示されるテキスト+ 0x50を):未定義の参照`printf '

私は試してみました

-lcパラメータを追加しますが、機能しません。未定義のメッセージが表示されます。

私のldスクリプト

OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv","elf64-littleriscv") 
OUTPUT_ARCH(riscv) 
ENTRY(_start) 
SEARCH_DIR("/path/to/install/riscv/toolchain/riscv64-unknow-elf/lib"); 
/*MEMORY{ //for my embedded allocation 
    flash : org = 0x0, l = 0x10000 
    ram : org= 0x10000, l = 512 
}*/ 
SECTIONS{ 
_start =0x10000; 
.text : 
{ 
    *(.text) 
} 
.bss : 
{ 
    *(.bss) 
    *(.sbss) 
}} 

はまた、私は、このコマンドのように、デフォルトのスクリプトを使用しようとしている: ....してください

$ riscv-unknown-elf-ld float.o -o float 

が、それは同じ結果です助けて!

よろしくお願いいたします。

+0

RISC-Vだけでなくはるかに多くを学ぶ必要があります。 http://norvig.com/21-days.html –

+0

を参照してください。なぜあなたのRISCV-VでLinuxを使用しないのですか?もし、Linuxがそのプラットフォーム上で完全に成熟していなくても、もっと簡単になるかもしれません... –

+0

私はLinux上でRISCV VMを手に入れました.CCSを使ってMCU(TI 320F28335)に移りました。ツールチェーンはLinux上にあります)、MCUにRISCV命令ロードを与えて実行してください –

答えて

0

printfは、C standard libraryによって提供されています(実装が非常に難しい)。あなたが、あなたはおそらく、あなたのriscv-unknown-elf-ld-Madditional optionsを渡すかもしれない

(またはそのライブラリの完全なパスを与えることで、おそらくあなたのriscv-unknown-elf-ldコマンドに-lcを追加することで)それをリンクする必要があり-L検索-dirの--verbose--traceld scriptsの章をさらに慎重に読んでください。

クロスコンパイルするので、ソースコードからlibcをクロスコンパイルする必要があります。

linkersELFのオブジェクトファイルと実行形式の動作を理解するのに、もっと時間を費やす必要があります(elf(5)も参照してください)。あなたは、関連するオブジェクト・ファイルを探索する(クロスobjdumpnmreadelfなどのような...)他のクロスbinutilsのプログラムを使用することができますLinkers and Loaders

を読んで考えてみましょう。

ベアメタルシステムをコーディングする場合、自立モード(GCCにpassing -ffreestanding)でコンパイルし、独自のprintf(または他の出力)機能を実装することができます。既存のfree software Cライブラリはあなたにインスピレーションを与えることができます(しかし、あなたはそれを見つける必要があります。

OSについてもお読みください。Operating Systems: Three Easy Pieces(ベアメタル上の組み込みシステムはOSesの機能を共有するため、OSの概念はあなたにとって重要です)。 OSDEV wikiも役立つかもしれませんが(RISC-Vについてはありません)

数ヶ月(または数年)のが必要な場合がありますので、適切に予算を設定してください。

ところで、あなたの例ではfloatを使用していると驚いています。浮動小数点は難しい。 floating-point-gui.deを参照してください。最初の試行では、整数のみの使用を検討します。

+0

__lttf2、write、close、fstatのような定義済み参照が表示されます... –

+0

これは、 –

+0

のスクリプトにSEARCH_DIRパスがあることを意味します。作業?または私はデフォルトを使用し、-Lを追加しますか? –

関連する問題