У меня есть очень простой main.c
файл:ссылка с и сборка
#include <stdio.h>
int cnt;
extern void increment();
int main()
{
cnt = 0;
increment();
printf("%d\n", cnt);
return 0;
}
И еще проще hello.asm
:
EXTERN cnt
section .text
global increment
increment:
inc dword [cnt]
ret
Первый я получаю main.o
набрав gcc -c main.c
Тогда я получаю hello.o
- nasm -f macho hello.asm -DDARWIN
И, наконец, чтобы получить исполняемый файл, выполните ld -o main main.o hello.o -arch i386 -lc
и получите ошибку:
ld: warning: -macosx_version_min not specified, assuming 10.10
ld: warning:
ignoring file main.o, file was built for unsupported file format ( 0xCF 0xFA 0xED 0xFE 0x07 0x00 0x00 0x01 0x03 0x00 0x00 0x00 0x01 0x00 0x00 0x00) which is not the architecture being linked (i386): main.o
Undefined symbols for architecture i386:
"_main", referenced from:
implicit entry/start for main executable
"cnt", referenced from:
increment in hello.o
ld: symbol(s) not found for architecture i386
Как исправить эту ошибку привязки?
@EOF потому, что не работает? 'gcc' не знает, чтобы вызывать' nasm' – Jester
@Jester: Да, я просто понял, что это не написано в газовой сборке ... – EOF
Вы случайно оказались на 64-битной ОС? Затем выполните 'gcc -m32' для вашего' main.c'. Вдоль линий предложения @ EOF вы также можете использовать gcc, как только вы получили свой 'hello.o' как:' gcc main.c hello.o' (добавьте '-m32', если необходимо). – Jester