نظيفة X86_64 إخراج التجميع مع دول مجلس التعاون الخليجي؟ [مكرر
سؤال
هذا السؤال لديه بالفعل إجابة هنا:
لقد قمت بتدريس نفسي جمعية جنو لفترة من الوقت الآن عن طريق كتابة البيانات في C، وتجميعها مع "دول مجلس التعاون الخليجي -S" ودراسة الإخراج. يعمل هذا على ما يرام على X86 (وتجميع مع -M32) ولكن على صندوق AMD64 الخاص بي، لهذا الرمز (بمجرد المثال):
int main()
{
return 0;
}
GCC يعطيني:
.file "test.c" .Text .globl. الرئيسية،.-الرئيسية. شخص .EH_FRAME، "A"، @ progbits .lframe1: .long .LECIE1-.LSCIE1 .LSCIE1: .long 0x0 .byte 0x1 .byte 0x1. . uleb128 0x1 .byte 0x3.byte 0xc .ulyb128 0x7 .ulyb128 0x8.byte 0x90 .ulyb128 0x1.align 8.lecie1: .lsfde1: .long.lefde1-.lasfde1 .lasfde1: .lasfde1: .long.lasfde1-. LFB2 .long .lfe2-.lfb2 .ulyb128 0x0 .byte 0x4.long .lcfi0-.lfb2 .byte 0xe .ulyb128 0x10.byte 0x86.ulyb128 0x2 .byte 0x4 .byte 0x4.logfi1-.lcfi0. محاذاة 8 .LEFDE1:
مقارنة مع:
.file "test.c". الإختيار .globl الرئيسية. Type الرئيسية، @ Main الرئيسية: Leal 4 (٪ ESP)،٪ ECX ANDL $ -16،٪ ESP Pushl -4 (٪ ECX) Pushl٪ EBP Movl٪ ESP، ٪ ebp pushl٪ ECX MOVL $ 0،٪ EAX POPL٪ ECX POPL٪ EBP LEAL -4 (٪ ECX)،٪ ESP RET. الحجم الرئيسي،.-Main. ". البيانات .note.gn-stack،"، @ progbits
على X86.
هل هناك طريقة لجعل دول مجلس التعاون الخليجي -S على إخراج x86_64 دون الزغب؟
المحلول
الاشياء التي تدخل .eh_frame
القسم هو الواصفات المفترضة، والتي تحتاجها فقط لاسترداد المكدس (على سبيل المثال مع GDB). أثناء تعلم التجميع، يمكنك ببساطة تجاهلها. هنا طريقة للقيام ب "التنظيف" الذي تريده:
gcc -S -o - test.c | sed -e '/^\.L/d' -e '/\.eh_frame/Q'
.file "test.c"
.text
.globl main
.type main,@function
main:
pushq %rbp
movq %rsp, %rbp
movl $0, %eax
leave
ret
.size main,.Lfe1-main
نصائح أخرى
يمكنك محاولة وضع الرمز الذي تريد دراسته في وظيفة.
على سبيل المثال:
int ftest(void)
{
return 0;
}
int main(void)
{
return ftest();
}
إذا نظرت إلى مصدر التجميع للاختبار، فسيكون نظيفا كما تحتاج.
..snip..
test:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $0, %eax
leave
ret
..snip..
لقد وجدت أن استخدام -Os
العلم يجعل الأمور أكثر وضوحا. لقد جربت ذلك مثالك الصغير، لكنه حقق اختلافا بسيطا للغاية.
ومع ذلك، أتذكر أنه مفيد عندما كنت أتعلم التجميع (على سبارك).