Linux 64位。 gcc 5.1
我使用gcc -O3 -march=native FLAGS -c myapp.c
编译代码
注意-c开关的存在。
假设该文件有一个功能。
目标:获取生成的代码并将其放入jit编译器中。保持最大限度的优化至关重要。
我希望机器代码准备好嵌入&在我的主程序中执行。
Libgccjit还不够成熟,无法使用(我也不喜欢这个界面)
是否有一个选项只能获取为函数生成的代码gcc,而不必求助于外部解析器丢弃与代码没有直接关系的框架和其他汇编信息?
愚蠢的代码示例:
.cstring
LC0:
.ascii "ok\0"
.section __TEXT,__text_cold,regular,pure_instructions
LCOLDB1:
.text
LHOTB1:
.align 4,0x90
.globl __Z4flopi
__Z4flopi:
LFB4:
pushq %rbp
LCFI0:
movl $0, %eax
movl $69, %ebp
pushq %rbx
LCFI1:
leal 71(%rdi), %ebx
leaq LC0(%rip), %rdi
subq $8, %rsp
LCFI2:
cmpl $56, %ebx
cmovne %eax, %ebp
call _puts
addq $8, %rsp
LCFI3:
leal 0(%rbp,%rbx), %eax
popq %rbx
LCFI4:
popq %rbp
LCFI5:
ret
LFE4:
.section __TEXT,__text_cold,regular,pure_instructions
LCOLDE1:
.text
LHOTE1:
.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
EH_frame1:
.set L$set$0,LECIE1-LSCIE1
.long L$set$0
LSCIE1:
.long 0
.byte 0x1
.ascii "zR\0"
.byte 0x1
.byte 0x78
.byte 0x10
.byte 0x1
.byte 0x10
.byte 0xc
.byte 0x7
.byte 0x8
.byte 0x90
.byte 0x1
.align 3
LECIE1:
LSFDE1:
.set L$set$1,LEFDE1-LASFDE1
.long L$set$1
LASFDE1:
.long LASFDE1-EH_frame1
.quad LFB4-.
.set L$set$2,LFE4-LFB4
.quad L$set$2
.byte 0
.byte 0x4
.set L$set$3,LCFI0-LFB4
.long L$set$3
.byte 0xe
.byte 0x10
.byte 0x86
.byte 0x2
.byte 0x4
.set L$set$4,LCFI1-LCFI0
.long L$set$4
.byte 0xe
.byte 0x18
.byte 0x83
.byte 0x3
.byte 0x4
.set L$set$5,LCFI2-LCFI1
.long L$set$5
.byte 0xe
.byte 0x20
.byte 0x4
.set L$set$6,LCFI3-LCFI2
.long L$set$6
.byte 0xe
.byte 0x18
.byte 0x4
.set L$set$7,LCFI4-LCFI3
.long L$set$7
.byte 0xe
.byte 0x10
.byte 0x4
.set L$set$8,LCFI5-LCFI4
.long L$set$8
.byte 0xe
.byte 0x8
.align 3
LEFDE1:
.constructor
.destructor
.align 1
.subsections_via_symbols
到
LC0:
.ascii "ok\0"
__Z4flopi:
pushq %rbp
movl $0, %eax
movl $69, %ebp
pushq %rbx
leal 71(%rdi), %ebx
leaq LC0(%rip), %rdi
subq $8, %rsp
cmpl $56, %ebx
cmovne %eax, %ebp
call _puts
addq $8, %rsp
leal 0(%rbp,%rbx), %eax
popq %rbx
popq %rbp
ret
不要担心链接器/装载器可能不喜欢它,我知道如何处理它。
由于