임베디드 아티스트의 libc 마이크로 컨트롤러 기반 임베디드 시스템을 대상으로하는 제거 된 C 표준 라이브러리 구현입니다.
귀중한 메모리 자원을 보존하기 위해이 라이브러리는 전체 C 표준 라이브러리 구현을 제공하지 않습니다. 대신, 베어 메탈 임베디드 시스템에 유용한 기능의 하위 집합이 선택되었습니다. 베어 메탈 또는 RTO 기반 임베디드 시스템이있는 경우이 라이브러리는 귀하를위한 것입니다!
내가 만나는 다른 많은 C 라이브러리와 달리이 라이브러리는 단위 테스트를 구현하고 C 표준 라이브러리 기능의 오픈 소스 구현에서 오랜 결함을 해결했습니다. 우리는 지속적으로 테스트를 추가하고 기준 구현에 비해 추가 개선을하고 있습니다.
이 라이브러리에는 malloc 과 free 포함되어 있지 않습니다. 동적 메모리 할당 지원이 필요한 경우 malloc 및 free 구현이 포함 된 내장 된 Artistry 's libmemory 와 같은 내용 과이 라이브러리를 연결해야합니다.
이 프로젝트에 기여하는 데 관심이 있으시면 CONTRIBUTING 가이드를 읽으십시오.
임베디드 아티스트의 libc 새로운 베어 메탈 및 RTO 기반 임베디드 시스템을 빠르게 가져올 수있는 휴대용 유용한 C 표준 라이브러리 기능 세트를 제공하기위한 것입니다.
또한 각 기능에 단위 테스트 범위가 있고 정적 분석기가 노출 된 결함을 해결함으로써 고품질 libc 구현을 제공하려고합니다. 많은 C 라이브러리 기능 구현은 테스트되지 않은 상태로 유지되며 오류가 포함되어 있습니다. 우리는 열악한 구현과 싸우고 있습니다.
메모리를 보존하기 위해이 라이브러리는 전체 C 표준 라이브러리 기능을 제공하지 않습니다. 대신, 베어 메탈 임베디드 시스템에 유용한 기능의 하위 집합이 선택되었습니다. 이 선택은 주로 마이크로 컨트롤러 중심 개발에 대한 저의 경험에 의해 주도되었습니다. 추가 기능이 필요한 경우 문제를 제기하고 기능 요청을하십시오.
이 라이브러리의 기능적 구현은 새로운 시스템의 휴대 성과 빠른 가져 오기를 위해 선택되었습니다. 이러한 기능에 대한보다 효율적인 구현이있을 수 있지만 종종 아키텍처 특정 구현입니다. 성능 향상에 대한 제안이 있다면, 우리는 항상 그 말을 듣고 기쁩니다.
이 라이브러리에는 malloc 과 free 포함되어 있지 않습니다. 메모리 할당 체계는 임베디드 시스템 (동적 메모리를 허용하지 않음)마다 크게 다르므로 시스템의 요구에 따라 자체 구현을 제공해야합니다. 이 라이브러리를 malloc 및 free 구현을 포함하는 임베디드 아티스트 libmemory 와 결합 할 수 있습니다.
이 라이브러리는 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 family (대부분의 eyalroz/printf 및 원래 mpaland/printf 를 기반으로 한 embeddedartistry/printf /printf를 통해)putcharputstime 유형 및 asctime()wchar 유형 정의 및 wctype 기능 또한이 라이브러리는 __stack_chk_guard 및 __stack_chk_fail 에 대한 구현을 제공합니다.
다음 아키텍처가 현재 지원됩니다.
다음 단위 테스트를 추가해야합니다.
reallocrand 가족이들은 미래에 추가 될 수 있습니다.
wchar 기능errno 지원 (컴파일 타임 스위치로 활성화)getopt 지원time 지원FILE 및 추가 stdio 함수우리는 현재 다음에 대한 완전한 지원을 계획하지 않습니다.
locale이 프로젝트는 임베디드 아티스트의 표준 Meson 빌드 시스템을 사용하며 종속성은 당사 웹 사이트에 자세히 설명되어 있습니다.
최소한이 필요합니다.
git-lfs 이 프로젝트는 git-lfs 사용하여 일부 파일을 저장합니다.
Linux에 git-lfs 설치하려면 :
sudo apt install git-lfs
MacOS에 git-lfs 설치하려면 :
brew install git-lfs
추가 설치 지침은 git-lfs 웹 사이트에서 찾을 수 있습니다.
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
이것은 현재 아키텍처의 모든 목표를 구축합니다.
다음을 사용하여 빌드를 청소할 수 있습니다.
make clean
다음을 사용하여 생성 된 buildresults 폴더를 제거 할 수 있습니다.
make distclean
컴파일을 위해 meson 직접 사용할 수도 있습니다.
빌드 출력 폴더 작성 :
meson buildresults
실행하여 모든 대상을 구축하십시오
ninja -C buildresults
meson Cross 파일을 사용하여 교차 컴파일이 처리됩니다. 예제 파일은 build/cross 폴더에 포함됩니다. 도구 체인, 컴파일 플래그 및 링커 플래그를 정의하여 특정 프로세서에 대해 자신의 크로스 파일을 작성할 수 있습니다. 이 설정은 libc 컴파일하는 데 사용됩니다. (또는 문제를 열면 우리가 당신을 도울 수 있습니다).
빌드 출력 폴더를 작성할 때 Meson 명령을 사용하여 교차 컴파일을 구성해야합니다. 예를 들어:
meson buildresults --cross-file build/cross/gcc_arm_cortex-m4.txt
이어서, 프로젝트 루트에서 make 실행하여 프로젝트를 구축 할 수 ninja .
테스트는 크로스 컴파일되지 않습니다. 그들은 기본 플랫폼을 위해서만 제작 될 것입니다.
프로젝트 구축, 대체 공구 체인을 사용하고 지원 툴링 실행에 대한 전체 지침은 웹 사이트의 임베디드 아티스트의 표준화 된 Meson 빌드 시스템에 문서화되어 있습니다.
위치 독립 코드 (PIC)는 기본적으로 활성화되어 있지만 내장 옵션 b_staticpic false 로 설정하여 Meson 구성 단계에서 비활성화 할 수 있습니다.
meson buildresults -Db_staticpic=false
내장 옵션 b_lto true 로 설정하여 Meson Configuration State에서 링크 타임 최적화 (LTO)를 활성화 할 수 있습니다.
meson buildresults -Db_lto=true
이것은 다른 빌드 옵션과 결합 할 수 있습니다.
프로젝트에 meson 사용하지 않는 경우이 프로젝트를 사용하는 가장 좋은 방법은 별도로 구축하고 헤더 및 라이브러리 내용을 소스 트리에 복사하는 것입니다.
include/ 디렉토리 내용을 소스 트리에 복사하십시오.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 사용하면 응용 프로그램의 카나리아 값을 사용자 정의 할 수 있습니다. 프로세서의 단어 크기와 같은 길이를 가진 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
이 라이브러리는 __stack_chk_guard 및 __stack_chk_fail 을 구현하여 GCC 및 Clang의 스택 보호 코드와 함께 사용할 수 있습니다.
__stack_chk_guard 의 기본값은 stack-canary-value 빌드 옵션으로 재정의 할 수 있습니다.
[최신 릴리스에 대한 문서는 항상 여기에서 찾을 수 있습니다] https://embeddedartistry.github.io/libc/index.html.
문서화는 다음 명령을 실행하여 로컬로 구축 할 수 있습니다.
make docs
문서화는 buildresults/docs 에서 찾을 수 있으며 루트 페이지는 index.html 입니다.
추가 지원이 필요하거나 궁금한 점이 있으면 Github 문제를 제출하거나 임베디드 아티스트 연락처 양식을 사용하여 이메일을 보내주십시오.
트위터 : mbeddedartistry에도 연락 할 수도 있습니다.
이 프로젝트에 기여하는 데 관심이 있으시면 기고 가이드 라인을 읽으십시오.
Copyright © 2022 Embedded Artistry LLC
이 프로젝트는 MIT 라이센스에 따라 라이센스가 부여됩니다. 자세한 내용은 라이센스 파일을 참조하십시오.
다른 오픈 소스 라이센스는 소프트웨어 인벤토리를 참조하십시오.
이 프로젝트에 직접 기여한 다음 개인에게 감사드립니다.
printf Library의 원래 저자)printf 라이브러리를 선택하고 지속적으로 개발)이 라이브러리에 사용 된 많은 오픈 소스 기능 구현은 두 가지 주요 소스에서 가져 왔습니다.
또한 오픈 소스 gdtoa 라이브러리를 사용하고 개선했습니다.
초기 테스트의 토대는 LIBC- 테스트 프로젝트를 참조하여 구현되었습니다.
위로 돌아갑니다