ссылка C и ассемблер


У меня есть очень простой main.c файл:

#include <stdio.h>
int cnt;
extern void increment();
int main()
{
    cnt = 0;
    increment();
    printf("%dn", 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

Как исправить эту ошибку связывания?

1 4

1 ответ:

  • укажите архитектуру (32/64 бит с опциями m32 или m64)
  • Ссылка crt файлы, эти файлы содержат время выполнения-это код, который вызывает вашу основную функцию

Измените файл asm:

EXTERN _cnt
section .text
global _increment
_increment:
  inc dword [_cnt]
ret

Таким образом, последние строки команд должны быть:

gcc -c -m32 main.c
nasm -f macho hello.asm -DDARWIN
ld hello.o main.o /usr/lib/crt1.o  -lc -o main

Проверьте арку и выполните:

file main
main: Mach-O executable i386

./main
1