libc المدمج LIBC هو تطبيق مكتبة قياسي مُجرِّد C تم استهدافه للأنظمة المضمّنة المستندة إلى متحكم.
من أجل الحفاظ على موارد الذاكرة الثمينة ، لا توفر هذه المكتبة تنفيذ المكتبة القياسية الكاملة C. بدلاً من ذلك ، تم اختيار مجموعة فرعية من الوظائف المفيدة على الأنظمة المدمجة العارية. إذا كان لديك نظام مضمن معدن عاري أو RTOS ، فإن هذه المكتبة هي لك!
على عكس العديد من مكتبات C الأخرى التي صادفتها ، تقوم هذه المكتبة بتنفيذ اختبارات الوحدة وقد عالجت عيوبًا طويلة الأمد في تطبيقات مفتوحة المصدر لوظائف المكتبة القياسية C. نحن نضيف باستمرار الاختبارات وإجراء تحسينات إضافية على تطبيقات خط الأساس.
لم يتم تضمين malloc و free في هذه المكتبة. إذا كنت بحاجة إلى دعم ديناميكي لتخصيص الذاكرة ، فستحتاج إلى إقران هذه المكتبة بشيء مثل libmemory المدمج للفن ، والذي يحتوي على تطبيقات malloc و free .
إذا كنت مهتمًا بالمساهمة في هذا المشروع ، فيرجى قراءة دليل CONTRIBUTING .
تهدف libc المدمجة في Artistry LIBC إلى توفير مجموعة محمولة من وظائف المكتبة القياسية المفيدة التي تتيح التقديم السريع للأنظمة المضمنة المعدنية العارية و RTOs الجديدة.
بالإضافة إلى ذلك ، نريد توفير تنفيذ libc عالي الجودة من خلال ضمان أن كل وظيفة لها تغطية اختبار الوحدة وتتناول العيوب المكشوفة من قبل المحلل الثابت. تظل العديد من تطبيقات وظيفة مكتبة C غير مختبرة وتحتوي على أخطاء. نحن نقاتل ضد التطبيقات السيئة.
من أجل الحفاظ على الذاكرة ، لا توفر هذه المكتبة وظائف المكتبة القياسية الكاملة C. بدلاً من ذلك ، تم اختيار مجموعة فرعية من الوظائف المفيدة على الأنظمة المدمجة العارية. كان هذا الاختيار مدفوعًا في المقام الأول بتجربتي الخاصة في التطوير الذي يركز على متحكم. إذا كنت بحاجة إلى ميزات إضافية ، فيرجى تقديم مشكلة وتقديم طلب ميزة.
تم اختيار التطبيقات الوظيفية في هذه المكتبة من أجل قابلية النقل والتقديم السريع للأنظمة الجديدة. قد تكون هناك تطبيقات أكثر كفاءة لهذه الوظائف ، ولكن غالبًا ما تكون تطبيقات محددة للهندسة المعمارية. إذا كان لديك اقتراحات لتحسين الأداء ، فنحن سعداء دائمًا بسماعها.
لم يتم تضمين malloc و free في هذه المكتبة. نظرًا لأن مخططات تخصيص الذاكرة تختلف اختلافًا كبيرًا مع الأنظمة المدمجة (بعضها لا يسمح حتى بالذاكرة الديناميكية) ، ستحتاج إلى توفير تطبيقاتك الخاصة بناءً على احتياجات نظامك. يمكنك إقران هذه المكتبة مع libmemory الفنية المدمجة ، والتي تحتوي على تطبيقات malloc و free .
توفر هذه المكتبة تنفيذًا كاملاً لتجميع وربط libc++ و libc++abi (انظر مشروع LIBCPP الخاص بالفن المدمج). من أجل تحقيق ذلك ، يتم تعريف بعض الوظائف فقط في الرؤوس ولكن ليس لديها تنفيذ. يمكن إزالة الوظائف غير المدعومة ولكن المحددة باستخدام خيار الإنشاء ( hide-unimplemented-libc-apis ).
تم تنفيذ الأجزاء التالية من مكتبة C:
assertcrt.c ، exit ، atexit ، إلخ)atoXabs ، labs ، llabsbsearchcallocdiv ، ldiv ، lldivheapsort ، heapsort_rimaxabs ، imaxdivqsort ، qsort_rrandreallocstrtoX (العديد عبر gdtoa )printf (معظمها عبر embeddedartistry/printf ، استنادًا إلى eyalroz/printf و mpaland/printf في الأصل)putcharputstime و asctime()wchar ووظائف wctype بالإضافة إلى ذلك ، توفر هذه المكتبة تطبيقات لـ __stack_chk_guard و __stack_chk_fail .
يتم دعم البنية التالية حاليًا:
يجب إضافة اختبارات الوحدة التالية:
reallocrandلا يتم تنفيذها في المستقبل:
wcharerrno (تم تمكينه كمفتاح وقت الترجمة)getopttimeFILE ووظائف stdio إضافيةنحن حاليا لا نخطط للدعم الكامل ل:
localeيستخدم هذا المشروع نظام بناء Meson القياسي للفنون المدمجة ، ويتم وصف التبعيات بالتفصيل على موقعنا.
على الأقل ستحتاج:
git-lfs ، والذي يستخدم لتخزين الملفات الثنائية في هذا المستودع يخزن هذا المشروع بعض الملفات باستخدام git-lfs .
لتثبيت git-lfs على Linux:
sudo apt install git-lfs
لتثبيت git-lfs على macos:
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
إذا كنت ترغب في تثبيت Meson على مستوى العالم على Linux ، فاستخدم:
sudo -H pip3 install meson
يستخدم هذا المشروع git-lfs ، لذا يرجى تثبيته قبل الاستنساخ. إذا قمت باستنساخ قبل تثبيت git-lfs ، فما عليك سوى تشغيل git lfs pull بعد التثبيت.
يتم استضافة هذا المشروع على جيثب. يمكنك استنساخ المشروع مباشرة باستخدام هذا الأمر:
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 الموحد الخاص بـ Artistry المدمجة على موقعنا.
يتم تمكين رمز الموضع المستقل (الموافقة المسبقة عن علم) افتراضيًا ، ولكن يمكن تعطيله أثناء مرحلة تكوين Meson عن طريق تعيين الخيار المدمج b_staticpic إلى false :
meson buildresults -Db_staticpic=false
يمكن تمكين تحسين وقت الارتباط (LTO) أثناء مرحلة تكوين Meson عن طريق تعيين الخيار المدمج b_lto إلى true :
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 ، أو باستخدام meson configure :
enable-pedantic : قم بتشغيل التحذيرات pedanticenable-pedantic-error : قم بتشغيل التحذيرات والأخطاء pedantichide-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_chk_guard مع خيار إنشاء stack-canary-value .
يمكن دائمًا العثور على وثائق أحدث إصدار هنا] https://embeddedartistry.github.io/libc/index.html.
يمكن بناء الوثائق محليًا عن طريق تشغيل الأمر التالي:
make docs
يمكن العثور على الوثائق في buildresults/docs ، وصفحة الجذر index.html .
إذا كنت بحاجة إلى مزيد من المساعدة أو لديك أي أسئلة ، فيرجى تقديم مشكلة في GitHub أو إرسال بريد إلكتروني إلينا باستخدام نموذج الاتصال الفني المدمج.
يمكنك أيضًا الوصول إلى Twitter: mbeddedartistry.
إذا كنت مهتمًا بالمساهمة في هذا المشروع ، فيرجى قراءة إرشاداتنا المساهمة.
حقوق الطبع والنشر © 2022 Artistry LLC
تم ترخيص هذا المشروع بموجب ترخيص معهد ماساتشوستس للتكنولوجيا - راجع ملف الترخيص للحصول على التفاصيل.
للحصول على تراخيص أخرى مفتوحة المصدر ، يرجى الاطلاع على مخزون البرمجيات.
أود أن أشكر الأفراد التاليين على مساهماتهم المباشرة في هذا المشروع:
printf )printf والتطوير المستمر)تم سحب العديد من تطبيقات الوظائف المفتوحة المصدر المستخدمة في هذه المكتبة من مصدرين أساسيين:
لقد استخدمت أيضًا وتحسين مكتبة gdtoa مفتوحة المصدر.
تم تنفيذ الأساس الأولي للاختبار من خلال الرجوع إلى مشروع اختبار LIBC.
العودة إلى الأعلى