وضع إبهام الذراع: حجم الكود لا يتناقص
-
29-09-2019 - |
سؤال
يا رفاق ، لدي مشروع جمعته لمعالج ARM Cortex-A8. أنا أستفيد من مجلس التعاون الخليجي للقيام بذلك. حاليا حجم القابل للتنفيذ هو 220.1 كيلو بايت. الآن أقوم بتعديل Makefile وأضيف العلم -mthumb
, ، يبدو خط Makefile مثل هذا -
gcc -mcpu=cortex-a8 -mthumb -marm -mfloat-abi=softfp -mfpu=neon
أقوم بهذا التغييرات في جميع Makefiles الخاصة بي وأبني مشروعي ، لكن قابلة للتنفيذ ، ما زالت أخيرًا ما زالت تبلغ 220.1 كيلو بايت.
لقد قمت بتغيير واحد آخر في سطر الأوامر الخاص بي ، أضفت خيار العمل -mthumb -Interwork
gcc -mcpu=cortex-a8 -mthumb -mthumb-interwork -marm -mfloat-abi=softfp -mfpu=neon
مرة أخرى أحصل على نفس الحجم القابل للتنفيذ 220.1 كيلو بايت. هل أفتقد أي شيء أثناء القيام بذلك؟
كتبت برنامجًا صغيرًا ، للعثور على أصغر رقمين وقمت بتجميعه باستخدام سطر الأوامر التالي
gcc main.c -o main
أحصل على 8.5 كيلو بايت قابلة للتنفيذ
بعد ذلك ، أفعل أ
gcc -mthumb main.c -o main
ما زلت أحصل على 8.5 كيلو بايت قابلة للتنفيذ.
ما الخطأ هنا؟
لقد فعلت ذلك ل cat /proc/cpuinfo
لمعرفة ما إذا كان الإبهام مدعومًا حقًا من قبل معالجتي ، وأرى أنه مدعوم بالفعل. انا حصلت -
Processor: ARMv7 Processor rev 5 (v7l)
Features: swp half thumb fastmult vfp edsp neon vfpv3
....
....
المحلول
أعتقد أن -Marm يعني أن لديك ذراعًا بدون إبهام ، حاول إزالة Marm.
نصائح أخرى
من الصعب القول دون الحصول على الكود الفعلي ، لكن لديّ اقتراحات.
- تمكين التحسينات. (على سبيل المثال -O3 -مقاطع وظيفية -مقاطع fdata)
- تجريد القابل للتنفيذ للتأكد من عدم حساب معلومات التصحيح.
- تحقق من حجم الكود الفعلي (.text) ، وليس حجم الملف. ربما هناك بعض الحشو. يمكنك استخدام OBJDump لذلك.
- قم بتفريغ رمز التجميع (مفتاح التبديل) وتحقق من أنه ينتج بالفعل تعليمات الذراع في حالة واحدة وإبهام في حالة أخرى.
مع بعض المترجمين ، يكون الإبهام هو الافتراضي عند التجميع لـ ARMV7. هل أنت متأكد من أن القابل للتنفيذ الأصلي لم يتم بناؤه إلى الإبهام؟
حاول البناء باستخدام -mno -thumb ومعرفة ما إذا كان حجم الكود يزداد أم لا.