gcc を使用して x86_64 アセンブリ出力をクリーンアップしますか?[重複]
質問
この質問にはすでに答えがあります:
私はしばらくの間、C でステートメントを書き、それを「gcc -S」でコンパイルし、出力を研究することで GNU アセンブリを独学してきました。これは x86 (および -m32 でコンパイル) では問題なく動作しますが、私の AMD64 ボックスでは、次のコードの場合 (単なる例として):
int main()
{
return 0;
}
GCC は私に次のように与えます:
.file "test.c" .text .globl main .type main, @function main: .LFB2: pushq %rbp .LCFI0: movq %rsp, %rbp .LCFI1: movl $0, %eax leave ret .LFE2: .size main, .-main .section .eh_frame,"a",@progbits .Lframe1: .long .LECIE1-.LSCIE1 .LSCIE1: .long 0x0 .byte 0x1 .string "zR" .uleb128 0x1 .sleb128 -8 .byte 0x10 .uleb128 0x1 .byte 0x3 .byte 0xc .uleb128 0x7 .uleb128 0x8 .byte 0x90 .uleb128 0x1 .align 8 .LECIE1: .LSFDE1: .long .LEFDE1-.LASFDE1 .LASFDE1: .long .LASFDE1-.Lframe1 .long .LFB2 .long .LFE2-.LFB2 .uleb128 0x0 .byte 0x4 .long .LCFI0-.LFB2 .byte 0xe .uleb128 0x10 .byte 0x86 .uleb128 0x2 .byte 0x4 .long .LCFI1-.LCFI0 .byte 0xd .uleb128 0x6 .align 8 .LEFDE1: .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" .section .note.GNU-stack,"",@progbits
と比べて:
.file "test.c" .text .globl main .type main, @function 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 .size main, .-main .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" .section .note.GNU-stack,"",@progbits
x86で。
綿毛なしで x86_64 出力アセンブリで GCC -S を作成する方法はありますか?
解決
.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
フラグを使用すると、物事が明確になりますことを発見しました。私はあなたの小さな一例を試してみましたが、それは非常に少しの違いを作っています。
、私は(SPARC上で)アセンブリを学んでいたとき、それは参考になりましたことを覚えていたこと。
所属していません StackOverflow