Ваш код 32-битная сборка. Компиляция на Snow Leopard по умолчанию 64-битная, но вы можете использовать gcc -m32
для компиляции 32-битного кода. Конечно, есть также опции, которые вы можете передать as
и ld
, но я обнаружил, что запоминания только опции для gcc
было достаточно, так как это интерфейс для всех этих вещей.
Используйте gcc, чтобы показать пример кода сборки, который работает: введите минимальную функцию C в файле test.c и используйте gcc -S test.c
для создания сборки в файле test.s.
Пример:
int x;
void f(void)
{
int i;
for (i = 0; i < 5; i++) x = x + 1;
}
скомпилирован в сборке на этом Leopard Mac:
.text
.globl _f
_f:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
call L6
"L00000000001$pb":
L6:
popl %ecx
movl $0, -12(%ebp)
jmp L2
L3:
leal L_x$non_lazy_ptr-"L00000000001$pb"(%ecx), %eax
movl (%eax), %eax
movl (%eax), %eax
leal 1(%eax), %edx
leal L_x$non_lazy_ptr-"L00000000001$pb"(%ecx), %eax
movl (%eax), %eax
movl %edx, (%eax)
leal -12(%ebp), %eax
incl (%eax)
L2:
cmpl $4, -12(%ebp)
jle L3
leave
ret
.comm _x,4,2
.section __IMPORT,__pointers,non_lazy_symbol_pointers
L_x$non_lazy_ptr:
.indirect_symbol _x
.long 0
.subsections_via_symbols
Вы можете сделать это проще, используя опцию gcc -fno-PIC:
.text
.globl _f
_f:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -12(%ebp)
jmp L2
L3:
movl _x, %eax
incl %eax
movl %eax, _x
leal -12(%ebp), %eax
incl (%eax)
L2:
cmpl $4, -12(%ebp)
jle L3
leave
ret
.comm _x,4,2
.subsections_via_symbols
На Snow Leopard вы получите 64-битную сборку (amd64). Вы можете получить то же самое на Leopard, используя опцию -m64 gcc, а на Snow Leopard вы можете получить то же самое, что и запустить gcc на Leopard с опцией -m32.