хмм
so.c
extern "C" int fun ( void );
int x;
int main()
{
x=fun();
return x;
}
fun.c
int fun ( void )
{
return(5);
}
build
gcc fun.c -O2 -c -o fun.o
g++ -O2 so.cpp fun.o -o so
Нет ошибок
00000000004003e0 <main>:
4003e0: 48 83 ec 08 sub $0x8,%rsp
4003e4: e8 17 01 00 00 callq 400500 <fun>
4003e9: 89 05 45 0c 20 00 mov %eax,0x200c45(%rip) # 601034 <x>
4003ef: 48 83 c4 08 add $0x8,%rsp
4003f3: c3 retq
0000000000400500 <fun>:
400500: b8 05 00 00 00 mov $0x5,%eax
400505: c3 retq
все в порядке
morefun.s
.globl fun
fun:
mov $0x5,%eax
retq
сборка
as morefun.s -o morefun.o
g++ -O2 so.cpp morefun.o -o so
без ошибок,
проверка
00000000004003e0 <main>:
4003e0: 48 83 ec 08 sub $0x8,%rsp
4003e4: e8 0d 01 00 00 callq 4004f6 <fun>
4003e9: 89 05 45 0c 20 00 mov %eax,0x200c45(%rip) # 601034 <x>
4003ef: 48 83 c4 08 add $0x8,%rsp
4003f3: c3 retq
0000000004004f6 <fun>:
4004f6: b8 05 00 00 00 mov $0x5,%eax
4004fb: c3 retq
По-прежнему выглядит хорошо, без проблем можно добавить сборку в проект C ++, сделав ее похожей на функцию C.
Другой путь
int fun ( void )
{
return(5);
}
GNU и большинство других вменяемых компиляторов компилируются вЗатем asm вызывает ассемблер, чтобы вы могли просто посмотреть, как они это делают, и повторить это
gcc -O2 -S fun.c -o fun.s
as fun.s -o fun.o
cat fun.s
.file "fun.c"
.section .text.unlikely,"ax",@progbits
.LCOLDB0:
.text
.LHOTB0:
.p2align 4,,15
.globl fun
.type fun, @function
fun:
.LFB0:
.cfi_startproc
movl $5, %eax
ret
.cfi_endproc
.LFE0:
.size fun, .-fun
.section .text.unlikely
.LCOLDE0:
.text
.LHOTE0:
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609"
.section .note.GNU-stack,"",@progbits
или использовать save-temps.
gcc -O2 -c -save-temps fun.c -o fun.o
чтобы увидеть asm, сгенерированный компилятором
Как правило, более болезненно пытаться использовать скомпилированную сборку в качестве исходной точки, как есть, конечно, вырезая и вставляя, но много нагрузки и машинасгенерированные ярлыки, которые вы хотите очистить, а не начинать с нуля.(Я предпочитаю разобрать и работать с этим, чем использовать вывод компилятора напрямую)