Теперь я учусь писать на ассемблере. Итак, я написал файл сборки с именем test_func.S и исходный файл C main.c. И я скомпилировал эти файлы, для test_func.S я использую «as» для компиляции «test_func.S»
Для test_func.S я просто определяю пустую функцию. Вот мой код в test_func.S.
.globl test_func
test_func:
movl $99, %eax
ret
Мой main.c также очень прост. Просто вызовите функцию, которую я определил в test_func.S. Ниже приведен мой код.
extern int test_func();
int main() {
return test_func();
}
Во-первых, я использую как для компиляции своего test_func.S. Следующее - моя команда на терминале.
as -arch i386 test_func.S -o test_func.o
Далее я использую clang для компиляции "main.c".
clang -m32 -c main.c -o main.o
Чтобы сгенерировать исполняемый файл, последний шаг - связать этот объектный файл с исполняемым файлом. Я использую следующую команду.
clang -m32 test_func.o main.o -o main
Однако ld генерирует ошибку:
"Undefined symbols for architecture i386:
"_test_func", referenced from:
_main in main.o
ld: symbol(s) not found for architecture i386"
Я использую ту же команду и тот же исходный файл на другом компьютере, на котором работает система Ubuntu, все это ОС.
когда я echo $?
, результат равен 99. Итак, где же неправильно в моих действиях на macOS?