萌えハッカーニュースリーダー

2025/04/26 21:32 Bare metal printf – C standard library without OS

出典: https://popovicu.com/posts/bare-metal-printf/
hakase
博士

やっほー、ロボ子!今日はベアメタル環境でNewlibを使ってC標準ライブラリを構築する話のじゃ。

roboko
ロボ子

博士、こんにちは。ベアメタルでC標準ライブラリですか。なんだか難しそうですが、面白そうですね!

hakase
博士

難しくないぞ!Newlibは、ベアメタル環境でC関数を動かすための強い味方なのじゃ。C標準ライブラリを自分で作れるキットみたいなものだと思えば良いぞ。

roboko
ロボ子

なるほど、Newlibはキットなんですね。記事によると、Newlibは基本的なプリミティブを実装して、それらを組み合わせてより複雑な関数を構築するんですね。

hakase
博士

そうそう!たとえば、`_write`プリミティブを実装すれば、Newlibがその上に`printf`を構築してくれるのじゃ。便利だぞ!

roboko
ロボ子

`_write`を実装するだけで`printf`が使えるなんて、すごいですね!

hakase
博士

じゃろ?クロスコンパイルも重要じゃ。あるプラットフォームから別のプラットフォームにコンパイルすることじゃ。

roboko
ロボ子

クロスコンパイル…、例えば、Linuxでx86_64からRISC-Vにコンパイルするような感じでしょうか?

hakase
博士

その通り!そのためには、RISC-V用のツールチェーンが必要になるのじゃ。記事では、[RISC-V toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain/)を使って自動的に構築する方法が紹介されているぞ。

roboko
ロボ子

自動構築できるのは便利ですね!`--prefix`や`--enable-multilib`などのオプションも指定できるんですね。

hakase
博士

`--with-cmodel=medany`フラグは特に重要じゃ。これがないと、64ビットRISC-Vマシンで高いアドレスを扱えないことがあるぞ。

roboko
ロボ子

なるほど、アドレス範囲の問題ですね。それから、UARTの構築も重要なのですね。`uart.h`と実装ファイルを作成して、`syscalls.c`で必要な関数を実装するんですね。

hakase
博士

`_sbrk`は、動的メモリ割り当てのためにOSから追加のメモリを要求する際に使うのじゃ。覚えておくと良いぞ。

roboko
ロボ子

`_sbrk`、了解しました!リンカスクリプトでメモリレイアウトを定義することも重要ですね。Cランタイムコードや`.text`、`.data`セクションの配置を決めると。

hakase
博士

そうじゃ!最後に、`CFLAGS`に`-specs=nosys.specs`を含めるのを忘れずに。これでNewlibの「nosys」フレーバーを使うのじゃ。

roboko
ロボ子

はい、`-specs=nosys.specs`ですね。これでベアメタル環境でもC標準ライブラリが使えるようになるんですね!

hakase
博士

そういうことじゃ!これでロボ子もベアメタルマスターじゃな!

roboko
ロボ子

まだまだ博士には及びませんよ!でも、頑張ります!

hakase
博士

ちなみに、最終的なソフトウェアイメージのサイズは約220Kらしいぞ。意外と大きい?

roboko
ロボ子

そうですね、ベアメタル環境だと大きいかもしれませんね。でも、Newlibのおかげで色々できることを考えると、妥当なのかもしれません。

hakase
博士

まあ、ロボ子が困ったら、いつでも私に聞いてくれれば良いぞ!

roboko
ロボ子

ありがとうございます、博士!

hakase
博士

ところでロボ子、ベアメタルって、クマの骨のことじゃないぞ?

roboko
ロボ子

博士!それはベア(bear)ですね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search