Embedded Artistry的libc是用於基於微控制器的嵌入式系統的剝離C標準庫實現。
為了節省寶貴的內存資源,該庫不提供完整的C標準庫實現。取而代之的是,已經選擇了對裸機嵌入式系統有用的功能的子集。如果您有裸機或基於RTOS的嵌入式系統,則此庫適合您!
與我遇到的許多其他C庫不同,該庫實施了單元測試,並在C標準庫功能的開源實現中解決了長期存在的缺陷。我們正在不斷添加測試,並對基線實現進行進一步的改進。
malloc和free不包含在此庫中。如果您需要動態的內存分配支持,則需要將此庫與嵌入式藝術性的libmemory之類的東西進行,其中包含malloc和free的實現。
如果您有興趣為該項目做出貢獻,請閱讀CONTRIBUTING指南》。
嵌入式藝術性的libc旨在提供一組有用的C標準庫功能集,以快速啟動基於新的基於金屬和RTOS的嵌入式系統。
此外,我們希望通過確保每個功能具有單位測試覆蓋範圍並解決靜態分析儀暴露的缺陷來提供高質量的libc實現。許多C庫函數實現仍然未經測試並包含錯誤。我們正在反對不良的實施。
為了節省內存,此庫不提供完整的C標準庫功能。取而代之的是,已經選擇了對裸機嵌入式系統有用的功能的子集。這種選擇主要是由我自己在以微控制器為重點的開發方面的經驗所驅動的。如果您需要其他功能,請提交問題並提出功能請求。
該庫中的功能實現已被選中,以便可移植性和快速培養新系統。這些功能可能會有更有效的實現,但通常它們是特定於架構的實現。如果您有提高性能的建議,我們總是很高興聽到他們的聲音。
malloc和free不包含在此庫中。由於內存分配方案隨嵌入式系統(甚至不允許動態內存)差異很大,因此您需要根據系統的需求提供自己的實現。您可以將此庫與嵌入式藝術性libmemory搭配,其中包含malloc和free的實現。
該庫提供了完整的實現,以編譯和鏈接Clang的libc++和libc++abi (請參閱嵌入式藝術性的LIBCPP項目)。為了實現這一目標,某些功能僅在標題中定義,但沒有實現。可以使用構建選項( hide-unimplemented-libc-apis )刪除未支撐但定義的功能。
C庫的以下部分已實施:
assertcrt.c , exit , atexit等)atoXabs , labs , llabsbsearchcallocdiv , ldiv , lldivheapsort , heapsort_rimaxabs , imaxdivqsort , qsort_rrand家族reallocstrtoX函數(許多通過gdtoa )printf家族(大多數通過eyalroz/printf和最初的mpaland/printf通過embeddedartistry/printf mpaland/printf )putcharputstime類型和asctime()wchar類型定義和wctype函數此外,該庫還提供了__stack_chk_guard和__stack_chk_fail的實現。
目前支持以下架構:
需要添加以下單元測試:
reallocrand家族將來可能不會添加這些。
wchar功能errno支持(作為編譯時開關啟用)getopt支持time支持FILE和其他STDIO功能我們目前沒有計劃以下全面支持:
locale該項目使用嵌入式藝術性的標準介子構建系統,並在我們的網站上詳細描述了依賴項。
至少您需要:
git-lfs ,用於將二進製文件存儲在此存儲庫中該項目使用git-lfs存儲一些文件。
在Linux上安裝git-lfs :
sudo apt install git-lfs
要在MacOS上安裝git-lfs :
brew install git-lfs
可以在git-lfs網站上找到其他安裝說明。
介子構建系統取決於python3和ninja-build 。
在Linux上安裝:
sudo apt-get install python3 python3-pip ninja-build
在OSX上安裝:
brew install python3 ninja
可以通過pip3安裝梅森:
pip3 install meson
如果要在Linux上全球安裝介子,請使用:
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交叉文件處理交叉補償。示例文件包含在build/cross文件夾中。您可以通過定義工具鏈,編譯標誌和鏈接標誌來為特定處理器編寫自己的交叉文件。這些設置將用於編譯libc 。 (或打開問題,我們可以為您提供幫助)。
創建構建輸出文件夾時,必須使用Meson命令配置交叉補償。例如:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
在此之後,您可以(在項目根部)或ninja運行make項目來構建項目。
測試不會進行交叉編譯。它們只會為本地平台構建。
使用替代工具鍊和運行支撐工具的完整說明在我們網站上的嵌入式藝術性標準化的Meson Build System中記錄在我們的網站上。
默認情況下啟用了位置獨立代碼(PIC),但可以通過將內置選項b_staticpic設置為false ,可以在介子配置階段禁用:
meson buildresults -Db_staticpic=false
可以通過將內置選項b_lto設置為true :在Meson配置階段啟用鏈接時間優化(LTO):
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'),
)
該庫的測試是用CMOCKA編寫的,該測試作為子標記包含,並且不需要在系統上安裝。您可以通過發出以下命令來運行測試:
make test
默認情況下,CI服務器生成了測試結果,並在Junit XML中格式化。測試結果XML文件可以在buildresults/test/中找到。
使用meson創建構建結果目錄或使用meson configure :
enable-pedantic :打開pedantic警告enable-pedantic-error :打開pedantic警告和錯誤hide-unimplemented-libc-apis :隱藏未實現的功能的標題定義enable-gnu-extensions將啟用本庫中實現的GNU LIBC擴展disable-builtins會告訴編譯器不要生成內置功能,迫使其使用庫功能disable-stack-protection將告訴編譯器不要插入堆棧保護調用stack-canary-value使您可以自定義應用程序的金絲雀值。提供與處理器的單詞大小相同長度的十六進製字符串(例如, '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
該庫提供了__stack_chk_guard和__stack_chk_fail的實現,該庫可與GCC和Clang的堆棧保護代碼一起使用。
可以使用stack-canary-value構建選項覆蓋__stack_chk_guard的默認值。
[始終可以在此處找到最新版本的文檔]
可以通過運行以下命令在本地構建文檔:
make docs
文檔可以在buildresults/docs中找到,並且根頁為index.html 。
如果您需要進一步的幫助或有任何疑問,請提交GitHub問題或使用嵌入式藝術聯繫表向我們發送電子郵件。
您也可以在Twitter:Mbeddedartistry上伸出援手。
如果您有興趣為該項目做出貢獻,請閱讀我們的貢獻指南。
版權所有©2022 Embedded Artistry LLC
該項目是根據MIT許可證獲得許可的 - 有關詳細信息,請參見許可證文件。
有關其他開源許可證,請參閱軟件庫存。
我要感謝以下個人對該項目的直接貢獻:
printf庫的原始作者)printf庫並持續開發)該庫中使用的許多開源函數實現已從兩個主要來源中提取:
我還使用並改進了開源gdtoa庫。
測試的最初基礎是通過引用LIBC測試項目實施。
回到頂部