关于不能调用 gcc 生成的 .o 问题总结 (我调用了一个AES.C没问题)
本贴代码中多处用了类似
switch(length)
编译方法
gcc -m32 -s -Wall -O2 -c main.c -o gcc32.o
gcc -m64 -s -Wall -O2 -c main.c -o gcc64.o
源代码 关键 [color=#7FFF00]switch[/color]
uint32_t __cdecl set(uint32_t a,SqList* b)
{
int i;
i = 0;
switch(a)
{
case 0:{
b->a0 = 1;
i = 0;
break;}
case 1:{
b->a1 = 1;
i = 1;
break;}
case 2:{
b->a2 = 1;
i = 2;
break;}
case 3:{
b->a3 = 1;
i = 3;
break;}
case 4: {
b->b0 = 1;
i = 4;
break;}
case 5:{
b->b1 = 1;
i = 5;
break;}
case 6:{
b->b2 = 1;
i = 6;
break;}
case 7:{
b->b3 = 1;
i = 7;
break;}
// default:printf("error");;
}
return i;
}
Delphi连接后运行 汇编
0060E47B 64668D4000 lea ax,[eax+$00]
set_gcc:
0060E480 8B442404 mov eax,[esp+$04]
0060E484 8B542408 mov edx,[esp+$08]
0060E488 83F807 cmp eax,$07
0060E48B 0F87CF000000 jnbe $0060e560
0060E491 FF248500000000 jmp dword ptr [eax*4+$0000] 红色部分Delphi并未处理好偏移 或许是标准不一样导致不认识
0060E498 8DB42600000000 lea esi,[esi+$0000]
gcc生成汇编文件
_set:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $0, -4(%ebp)
cmpl $7, 8(%ebp)
ja L2
movl 8(%ebp), %eax
sall $2, %eax
addl $L4, %eax
movl (%eax), %eax
jmp *%eax
.section .rdata,"dr"
.align 4
关于不能调用 gcc 生成的 .o 问题总结 (我调用了一个AES.C没问题)
原文:https://www.cnblogs.com/marklove/p/14290443.html