Embedded Artistryのlibc 、マイクロコントローラーベースの埋め込みシステムを対象とした、削除されたC標準ライブラリ実装です。
貴重なメモリリソースを節約するために、このライブラリは完全なC標準ライブラリの実装を提供しません。代わりに、ベアメタル埋め込みシステムで役立つ機能のサブセットが選択されています。裸の金属またはRTOSベースの埋め込みシステムがある場合、このライブラリはあなたのためです!
私が出会った他の多くのCライブラリとは異なり、このライブラリはユニットテストを実装し、C標準ライブラリ関数のオープンソースの実装における長年の欠陥に対処しています。テストを継続的に追加し、ベースラインの実装よりも追加の改善を行っています。
mallocとfreeこのライブラリには含まれていません。動的なメモリ割り当てサポートが必要な場合は、このライブラリを、 mallocとfreeの実装を含む組み込みArtistryのlibmemoryのようなものと結合する必要があります。
このプロジェクトに貢献することに興味がある場合は、 CONTRIBUTINGガイドをお読みください。
Embedded Artistry's libc 、新しい裸のメタルおよびRTOSベースの埋め込みシステムを迅速に引き上げることを可能にする有用なC標準ライブラリ関数のポータブルセットを提供することを目的としています。
さらに、各関数にユニットテストカバレッジがあり、静的アナライザーによって公開された欠陥に対処することにより、高品質のlibc実装を提供したいと考えています。多くのCライブラリ機能の実装は、テストされていないままであり、エラーが含まれています。私たちは、貧弱な実装と戦っています。
メモリを保存するために、このライブラリは完全なC標準ライブラリ機能を提供しません。代わりに、ベアメタル埋め込みシステムで役立つ機能のサブセットが選択されています。この選択は、主にマイクロコントローラー中心の開発での私自身の経験によって推進されています。追加機能が必要な場合は、問題を提出して機能リクエストを行ってください。
このライブラリの機能的な実装は、新しいシステムの移植性と迅速な育成のために選択されています。これらの機能にはより効率的な実装があるかもしれませんが、多くの場合、それらはアーキテクチャ固有の実装です。パフォーマンスを向上させるための提案がある場合は、いつも聞いて喜んでいます。
mallocとfreeこのライブラリには含まれていません。メモリの割り当てスキームは、組み込みシステム(動的メモリを許可しないものもありません)によって大きく異なるため、システムのニーズに基づいて独自の実装を提供する必要があります。このライブラリを、 mallocとfreeの実装を含む埋め込みArtistry libmemoryと組み合わせることができます。
このライブラリは、Clangのlibc++およびlibc++abiコンパイルおよびリンクするための完全な実装を提供します(組み込みArtistryのLIBCPPプロジェクトを参照)。これを達成するために、一部の関数はヘッダーでのみ定義されますが、実装はありません。サポートされていないが定義されていない関数は、ビルドオプション( hide-unimplemented-libc-apis )を使用して削除できます。
Cライブラリの次の部分が実装されています。
assertcrt.c 、 exit 、 atexitなど)atoXabs 、 labs 、 llabsbsearchcallocdiv 、 ldiv 、 lldivheapsort 、 heapsort_rimaxabs 、 imaxdivqsort 、 qsort_rrand家reallocstrtoX関数(多くはgdtoa経由)printfファミリー(ほとんどのembeddedartistry/printf 、 eyalroz/printfおよび元々 mpaland/printfに基づく)putcharputstime型とasctime()wcharタイプ定義とwctype関数さらに、このライブラリは、 __stack_chk_guardと__stack_chk_failの実装を提供します。
現在、次のアーキテクチャがサポートされています。
次の単体テストを追加する必要があります。
reallocrand家これらは、将来追加される可能性があることによって実装されていません。
wchar機能errnoサポート(コンパイル時間スイッチとして有効)getoptサポートtimeサポートFILEおよび追加のstdio関数現在、以下の完全なサポートを計画していません。
localeこのプロジェクトでは、組み込みArtistryの標準的なMesonビルドシステムを使用しており、依存関係については当社のWebサイトで詳しく説明されています。
少なくともあなたは必要です:
git-lfs 、このリポジトリにバイナリファイルを保存するために使用されますこのプロジェクトはgit-lfsを使用していくつかのファイルを保存します。
Linuxにgit-lfsをインストールするには:
sudo apt install git-lfs
git-lfs macosにインストールするには:
brew install git-lfs
追加のインストール手順は、 git-lfs Webサイトにあります。
Mesonビルドシステムは、 python3とninja-buildに依存します。
Linuxにインストールするには:
sudo apt-get install python3 python3-pip ninja-build
OSXにインストールするには:
brew install python3 ninja
Mesonはpip3を介してインストールできます。
pip3 install meson
LinuxにグローバルにMesonをインストールする場合は、以下を使用してください。
sudo -H pip3 install meson
このプロジェクトではgit-lfsを使用しているため、クローニングする前にインストールしてください。 git-lfsをインストールする前にクローニングした場合は、インストール後にgit lfs pull実行するだけです。
このプロジェクトはGitHubでホストされています。このコマンドを使用して、プロジェクトを直接クローンできます。
git clone --recursive [email protected]:embeddedartistry/libc.git
再帰的にクローンを作成しない場合は、リポジトリで次のコマンドを実行するか、ビルドが失敗します。
git submodule update --init
メイクがインストールされている場合、次のコマンドを発行することにより、ライブラリを構築できます。
make
これにより、現在のアーキテクチャのすべてのターゲットが構築されます。
以下を使用してビルドを掃除できます。
make clean
次を使用して、生成されたbuildresultsフォルダーを削除できます。
make distclean
mesonを直接使用してコンパイルすることもできます。
ビルド出力フォルダーを作成します。
meson buildresults
実行してすべてのターゲットを構築します
ninja -C buildresults
クロスコンパイルは、 meson Cross Filesを使用して処理されます。サンプルファイルはbuild/crossフォルダーに含まれています。ツールチェーン、コンパイルフラグ、およびリンカーフラグを定義することにより、特定のプロセッサ用の独自のクロスファイルを作成できます。これらの設定は、 libcコンパイルに使用されます。 (または問題を開き、私たちはあなたを助けることができます)。
Build Outputフォルダーを作成するときに、Mesonコマンドを使用してクロスコンパイルを構成する必要があります。例えば:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
それに続いて、(プロジェクトルートで) makeまたはninjaを実行してプロジェクトを構築できます。
テストは相互コンパイルされません。それらはネイティブプラットフォーム用にのみ構築されます。
プロジェクトを構築し、代替ツールチェーンを使用し、サポートするツールを実行するための完全な指示は、当社のWebサイトに埋め込まれたArtistryの標準化されたMesonビルドシステムに文書化されています。
Position Independent Code(PIC)はデフォルトで有効になりますが、組み込みのオプションb_staticpic falseに設定することにより、Meson構成段階で無効にすることができます。
meson buildresults -Db_staticpic=false
リンク時間最適化(LTO)は、組み込みのオプションb_lto trueに設定することにより、Meson構成段階で有効にできます。
meson buildresults -Db_lto=true
これは、他のビルドオプションと組み合わせることができます。
mesonプロジェクトに使用しない場合、このプロジェクトを使用するのに最適な方法は、それを個別に構築し、ヘッダーとライブラリの内容をソースツリーにコピーすることです。
include/ directoryコンテンツをソースツリーにコピーします。buildresults/srcフォルダーに保存されますリンカーフラグの例:
-Lpath/to/libc.a -lc
mesonを使用している場合は、 libcサブプロジェクトとして使用できます。選択したサブプロジェクトディレクトリに配置し、 subprojectステートメントを追加します。
libc = subproject('libc')
あなたは、あなたのプロジェクトに目的のサブプロジェクト依存性変数を宣伝する必要があります:
libc_dep = libc.get_variable('libc_dep')
executable宣言またはその他の依存関係で、ターゲットライブラリ構成の依存関係を使用できます。例えば:
fwdemo_sim_platform_dep = declare_dependency(
include_directories: fwdemo_sim_platform_inc,
dependencies: [
fwdemo_simulator_hw_platform_dep,
posix_os_dep,
libmemory_native_dep,
libc_dep, # <----- libc added here
libcxxabi_native_dep,
libcxx_full_native_dep,
logging_subsystem_dep
],
sources: files('platform.cpp'),
)
このライブラリのテストは、サブプロジェクトとして含まれており、システムにインストールする必要はありません。次のコマンドを発行して、テストを実行できます。
make test
デフォルトでは、テスト結果はCIサーバーで使用するために生成され、Junit XMLでフォーマットされています。テスト結果XMLファイルはbuildresults/test/にあります。
mesonを使用してBuild Results Directoryを作成する場合、またはmeson configureを使用して、次のMesonプロジェクトオプションをこのライブラリに設定できます。
enable-pedantic : pedantic警告をオンにしますenable-pedantic-error : pedantic警告とエラーをオンにしますhide-unimplemented-libc-apis :実際に実装されていない関数のヘッダー定義を隠しますenable-gnu-extensionsこのライブラリに実装されているGNU LIBC拡張機能を有効にしますdisable-builtins 、コンパイラに内蔵機能を生成しないように指示し、ライブラリ関数を使用するように強制しますdisable-stack-protectionコンパイラにスタック保護コールを挿入しないように指示しますstack-canary-value使用すると、アプリケーションのカナリア値をカスタマイズできます。プロセッサの単語サイズと同じ長さで16進数文字列( '0xdeadbeef' )を提供します。disable-stk-guard-runtime-configプログラムの初期化中に__stk_chk_guardを構成するために使用されるコードを無効にします。このオプションがtrue場合、プログラムはガード値のハードコーディングされた定義を使用することに戻ります。オプションは-Dおよびオプション名を使用して指定できます。
meson buildresults -Ddisable-builtins=false
同じスタイルがmeson configureで動作します。
cd buildresults
meson configure -Ddisable-builtins=false
このライブラリは、GCCとClangのスタック保護コードで使用できる__stack_chk_guardと__stack_chk_failの実装を提供します。
__stack_chk_guardのデフォルト値はstack-canary-valueビルドオプションでオーバーライドできます。
[最新リリースのドキュメントはいつでもここにあります] https://embeddedartistry.github.io/libc/index.html。
ドキュメントは、次のコマンドを実行してローカルに構築できます。
make docs
ドキュメントはbuildresults/docsにあり、ルートページはindex.htmlです。
さらなる支援が必要な場合、または質問がある場合は、githubの問題を提出するか、組み込みのArtistry連絡フォームを使用してメールを送信してください。
Twitter:mbeddedartistryにも連絡することもできます。
このプロジェクトに貢献することに興味がある場合は、貢献ガイドラインをお読みください。
Copyright©2022 Embedded Artistry LLC
このプロジェクトは、MITライセンスに基づいてライセンスされています - 詳細については、ライセンスファイルを参照してください。
他のオープンソースライセンスについては、ソフトウェアインベントリをご覧ください。
このプロジェクトに関する直接的な貢献について、次の個人に感謝したいと思います。
printfライブラリの元の著者)printfライブラリと継続的な開発を取り上げました)このライブラリで使用されているオープンソース機能の実装の多くは、2つの主要なソースから引き出されました。
また、オープンソースgdtoaライブラリを使用して改善しました。
テストの最初の基礎は、LIBCテストプロジェクトを参照することにより実装されました。
トップに戻ります