2015-04-28 5 views
4

У меня есть очень простой 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 

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

+0

@EOF потому, что не работает? 'gcc' не знает, чтобы вызывать' nasm' – Jester

+0

@Jester: Да, я просто понял, что это не написано в газовой сборке ... – EOF

+1

Вы случайно оказались на 64-битной ОС? Затем выполните 'gcc -m32' для вашего' main.c'. Вдоль линий предложения @ EOF вы также можете использовать gcc, как только вы получили свой 'hello.o' как:' gcc main.c hello.o' (добавьте '-m32', если необходимо). – Jester

ответ

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

Измените файл ассемблера :

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 
+0

Почему нам нужны символы подчеркивания перед именами переменных? – theluckyemil

+0

@theluckyemil ответ здесь http://stackoverflow.com/questions/5908568/what-is-the-reason-function-names-are-prefixed-with-an-underscore-by-the-compile – Arseniy

Смежные вопросы