
مكتبة متعددة المعماريات لفك تكديس استدعاءات البرنامج، مما يتيح التصحيح منخفض المستوى، وتحليل الأعطال، وأبحاث الأمان عبر أنظمة لينكس، فري بي إس دي، وHP-UX.
-- mode: Outline --
هذه هي الإصدارة 1.0 من مكتبة unwind. تدعم هذه المكتبة عدة مجموعات من المعماريات/أنظمة التشغيل:
Linux/x86-64: تعمل بشكل جيد. Linux/x86: تعمل بشكل جيد. Linux/ARM: تعمل بشكل جيد. Linux/IA-64: تم اختبارها ودعمها بالكامل. Linux/PARISC: تعمل بشكل جيد، لكن مكتبة C تفتقر إلى unwind-info. HP-UX/IA-64: تعمل في الغالب ولكن من المعروف أن بها بعض القيود الخطيرة. Linux/AArch64: مضافة حديثاً. Linux/PPC64: مضافة حديثاً. Linux/SuperH: مضافة حديثاً. FreeBSD/i386: مضافة حديثاً. FreeBSD/x86-64: مضافة حديثاً (تُعرف معمارية FreeBSD باسم amd64).
بشكل عام، يمكن بناء هذه المكتبة وتثبيتها باستخدام الأوامر التالية:
$ autoreconf -i # مطلوب فقط للبناء من git. يعتمد على libtool.
$ ./configure
$ make
$ make install prefix=PREFIX
حيث PREFIX هو بادئة التثبيت. بشكل افتراضي، تُستخدم بادئة /usr/local، بحيث يتم تثبيت libunwind.a في /usr/local/lib ويتم تثبيت unwind.h في /usr/local/include. للاختبار، قد ترغب في استخدام بادئة /usr/local بدلاً من ذلك.
** الإصدارة 8 وما بعدها
بدءاً من الإصدارة 8، الاسم المفضل لمترجم Intel IA-64 هو "icc" (نفس الاسم على x86). لذلك، يجب أن يبدو سطر التهيئة كالتالي:
$ ./configure CC=icc CFLAGS="-g -O3 -ip" CXX=icc CCAS=gcc CCASFLAGS=-g \
LDFLAGS="-L$PWD/src/.libs"
في الوقت الحالي، يجب بناء libunwind باستخدام GCC على HP-UX.
يجب تهيئة وتثبيت libunwind على HP-UX كما يلي:
$ ./configure CFLAGS="-g -O2 -mlp64" CXXFLAGS="-g -O2 -mlp64"
ملاحظة: فك اللف لثنائيات 32-bit (ILP32) غير مدعوم حالياً.
** حل مؤقت للإصدارات الأقدم من GCC
يأتي GCC v3.0 و GCC v3.2 مع إصدارة سيئة من sys/types.h. الحل المؤقت هو تنفيذ الأوامر التالية قبل تشغيل "configure":
$ mkdir $top_dir/include/sys
$ cp /usr/include/sys/types.h $top_dir/include/sys
تم إصلاح GCC v3.3.2 أو أحدث ولا يتطلب هذا الحل المؤقت.
للبناء لـ power64 يجب استخدام:
$ ./configure CFLAGS="-g -O2 -m64" CXXFLAGS="-g -O2 -m64"
إذا كان المعالج الخاص بك يدعم سجلات altivec: $ ./configure CFLAGS="-g -O2 -m64 -maltivec" CXXFLAGS="-g -O2 -m64 -maltivec"
للتحقق مما إذا كان المعالج لديك يدعم السجلات المتجهة (altivec): cat /proc/cpuinfo | grep altivec ويجب أن تحصل على شيء مثل هذا: cpu : PPC970, altivec supported
إذا بدا أن libunwind لا يعمل (فشل تتبع المكدس)، فحاول ترجمته باستخدام -O0، بدون تحسينات. هناك بعض مشكلات المترجم اعتماداً على إصدارة gcc الخاصة بك.
تنطبق تعليمات البناء العامة. لبناء وتنفيذ عدة اختبارات، تحتاج إلى مكتبة libexecinfo المتاحة في المنافذ (ports) كـ devel/libexecinfo.
تم تطوير المنفذ على FreeBSD 8.0-STABLE. تم بناء المكتبة باستخدام مترجم النظام وهو نسخة معدلة من gcc 4.2.1، وكذلك gcc 4.4.3.
بعد بناء المكتبة، يمكنك تشغيل مجموعة من اختبارات الانحدار باستخدام:
$ make check
** النتائج المتوقعة على IA-64 Linux
ما لم يكن لديك مكتبة C ومترجم حديثان جداً، فمن المتوقع حالياً فشل الاختبارات التالية على IA-64 Linux:
Gtest-init (يجب أن ينجح بدءاً من glibc-2.3.x/gcc-3.4)
Ltest-init (يجب أن ينجح بدءاً من glibc-2.3.x/gcc-3.4)
test-ptrace (يجب أن ينجح بدءاً من glibc-2.3.x/gcc-3.4)
run-ia64-test-dyn1 (يجب أن ينجح بدءاً من glibc-2.3.x)
هذا لا يعني أنه لا يمكن استخدام libunwind مع مترجمين أو مكتبات C أقدم، بل يعني فقط أنه في حالات معينة (زوايا)، سيفشل فك اللف. نظراً لأنها حالات زاوية، فمن غير المحتمل أن تطلقها التطبيقات.
ملاحظة: إذا حصلت على الكثير من الأخطاء في Gia64-test-nat و Lia64-test-nat، فهذه علامة شبه مؤكدة على وجود assembler قديم. كان GNU assembler يرمز للإزاحات السابقة للمؤشر-إلى-المكدس بشكل غير صحيح. تم إصلاح هذا الخلل في 21-Sep-2004 لذا فإن أي assembler لاحق سيكون جيداً.
** النتائج المتوقعة على x86 Linux
من المتوقع فشل الاختبارات التالية على x86 Linux:
Gtest-resume-sig (يفشل في الحصول على SIGUSR2)
Ltest-resume-sig (نفس الشيء)
Gtest-dyn1 (لا يوجد دعم لمعلومات اللف الديناميكي بعد)
Ltest-dyn1 (لا يوجد دعم لمعلومات اللف الديناميكي بعد)
test-setjmp (longjmp() لم يتم تنفيذه بعد)
run-check-namespace (لا يوجد _Ux86_getcontext بعد)
test-ptrace
** النتائج المتوقعة على x86-64 Linux
من المتوقع فشل الاختبارات التالية على x86-64 Linux:
Gtest-dyn1 (لا يوجد دعم لمعلومات اللف الديناميكي بعد)
Ltest-dyn1 (لا يوجد دعم لمعلومات اللف الديناميكي بعد)
Gtest-init (انظر http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18743)
Ltest-init (نفس الشيء)
test-async-sig (يتعطل بسبب معلومات unwinding سيئة؟)
test-setjmp (longjmp() لم يتم تنفيذه بعد)
run-check-namespace (لا يوجد _Ux86_64_getcontext بعد)
run-ptrace-mapper (??? استقصاء)
run-ptrace-misc (انظر http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18748
و http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18749)
** النتائج المتوقعة على PARISC Linux
ملاحظة: GCC v3.4 أو أحدث مطلوب على PA-RISC Linux. فشلت الإصدارات الأقدم من المترجم في إنشاء رأس البرنامج لمعالجة الاستثناءات (GNU_EH_FRAME) المطلوب لفك اللف.
من المتوقع فشل الاختبارات التالية على x86-64 Linux (خطأ في النص الأصلي: PARISC):
Gtest-bt (اقتطاع التتبع الخلفي عند kill() بسبب نقص unwind-info)
Ltest-bt (نفس الشيء)
Gtest-resume-sig (Gresume.c:my_rt_sigreturn() خاطئ بطريقة ما)
Ltest-resume-sig (نفس الشيء)
Gtest-init (نفس الشيء)
Ltest-init (نفس الشيء)
Gtest-dyn1 (لا يوجد دعم لمعلومات اللف الديناميكي بعد)
Ltest-dyn1 (لا يوجد دعم لمعلومات اللف الديناميكي بعد)
test-setjmp (longjmp() لم يتم تنفيذه بعد)
run-check-namespace (سلسلة الأدوات لا تدعم HIDDEN بعد)
** النتائج المتوقعة على HP-UX
"make check" غير مدعوم حالياً على HP-UX. يمكنك محاولة تشغيله، لكن معظم الاختبارات ستفشل (وبعضها قد يفشل في الإنهاء). برامج الاختبار الوحيدة المعروفة بأنها تعمل في هذا الوقت هي:
tests/bt
tests/Gperf-simple
tests/test-proc-info
tests/test-static-link
tests/Gtest-init
tests/Ltest-init
tests/Gtest-resume-sig
tests/Ltest-resume-sig
** النتائج المتوقعة على PPC64 Linux
يجب أن يعمل "make check" مع فشل لا يزيد عن 10 من أصل 24 اختباراً.
يتضمن هذا التوزيع عدداً قليلاً من اختبارات الأداء البسيطة التي تعطي فكرة عن التكلفة الأساسية لعمليات libunwind المختلفة. بعد بناء المكتبة، يمكنك تشغيل هذه الاختبارات باستخدام الأوامر التالية:
$ cd tests $ make perf
يرجى توجيه جميع الأسئلة المتعلقة بهذه المكتبة إلى:
يمكنك فعل ذلك عن طريق إرسال بريد إلكتروني إلى [email protected] مع نص:
subscribe libunwind-devel
أو يمكنك الاشتراك وإدارة اشتراكك عبر واجهة الويب على:
https://savannah.nongnu.org/mail/?group=libunwind