
مكتبة C متعددة البنى لفك تكدس المكدس، وتوليد تتبع التراجع، ومعالجة الاستثناءات، تُستخدم لأغراض التصحيح والتنميط وتحليل الثنائيات على لينكس وفري بي إس دي وإتش بي-يو إكس.
-- mode: Outline --
هذا هو الإصدار 1.0 من مكتبة unwind. تدعم هذه المكتبة العديد من تركيبات المعمارية/نظام التشغيل:
Linux/x86-64: يعمل جيدًا. Linux/x86: يعمل جيدًا. Linux/ARM: يعمل جيدًا. Linux/IA-64: تم اختباره ودعمه بالكامل. Linux/PARISC: يعمل جيدًا، لكن مكتبة C تفتقر إلى معلومات unwind. 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 كالتالي:
$ ./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"
ملاحظة: فك الترجمة (unwinding) للثنائيات 32 بت (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 المتاحة في المنافذ كـ 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، فمن شبه المؤكد أنها علامة على وجود مُجمّع قديم. كان مُجمّع GNU يُشفّر إزاحات متعلقة بمؤشر المكدس السابق بشكل غير صحيح. تم إصلاح هذا الخطأ في 21-Sep-2004، لذا فإن أي مُجمّع لاحق سيكون جيدًا.
** النتائج المتوقعة على 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 (يتعطل بسبب معلومات فك ترجمة سيئة؟)
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:
Gtest-bt (اقتطاع التتبع العكسي عند kill() بسبب نقص معلومات فك الترجمة)
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