Компоновщик жалуется, что atol
не был найден, потому что это функция в библиотеке C, но вы не сказали компоновщику добавить библиотеку C в вашу программу во время компоновки.Чтобы это исправить, передайте компоновщику -lc
, чтобы добавить библиотеку C во время компоновки:
ld -o function function.o -lc
Очень важно, чтобы -lc
был последним, иначе ссылка может не работать.Это связано с тем, что компоновщик выбирает функции из библиотек в указанном вами порядке.Когда вы указываете -lc
перед function.o
, она игнорирует библиотеку, поскольку сейчас ей ничего не нужно.Затем он видит function.o
с неопределенным atol
и не находит определения, что приводит к сбою ссылки.
Наконец, когда вы используете библиотеку C, вы должны запустить свою программу с main
функция (т. е. переименование _start
в main
) как обычная программа на C и связь через компилятор C:
clang -g -o function function.s
Это приводит к автоматическому связыванию библиотеки C и ее правильной инициализации,предотвращение некоторых странных ошибок.Если вы используете какие-либо функции ввода-вывода, например printf
, из библиотеки C, вам также следует завершить свою программу, вызвав exit
, чтобы стандартные потоки ввода-вывода были сброшены правильно.
Обратите внимание, что файл stdlib.h
являетсякрасная сельдьЗаголовочные файлы не нужны для программирования в сборке.Их цель - сообщить компилятору C, какой тип некоторых функций.Это не нужно, если вы не используете компилятор Си.Директива .file
не делает то, что вы ожидаете.