Как связать некоторый объектный файл в macOS с помощью ld? - PullRequest
0 голосов
/ 11 мая 2018

Теперь я учусь писать на ассемблере. Итак, я написал файл сборки с именем 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?

...