Изучая системные вызовы, решил написать свою обертку для вызова write на Си. Получился вот такой код: write.c Код (C): #include <stddef.h> void write(void *data, size_t size) { asm("mov $4, %eax"); asm("mov $1, %ebx"); asm("mov data, %ecx"); asm("mov size, %edx"); asm("int $0x80"); } main.c Код (C): #include <stddef.h> extern void write(const void *, size_t); int main(void) { const char *msg = "hello"; const size_t size = 5; write(msg, size); } Генерирую объектники: gcc -c write.c и gcc -c main.c, потом линкую: ld main.o write.o, однако я получаю ошибку: Что я делаю не так?
не используй ld на прямую, юзай gcc обертку... он не может у тебя найти точку входа, которая формально объявлена в CRT, а она уже вызывает main функции в зависимости от того, какой исполняемый файл ты просишь получить... и опять же формально точка входа должна быть int main(int argc, char** argv) и возвращать 0 в случае успеха выполнения консольной программы... если хочешь не использовать CRT, а вызывать твою точку входа на прямую, то она должна быть вида int start() и ты должен указать "-nostdlib" параметр для gcc... имя функции (мангленное) можно указать параметром gcc "-E<имя_точки_входа>"...
Изменил сигнатуру точки входа на сишную: Код (C): #include <stddef.h> extern void write(const void *, size_t); int main(int argc, char **argv) { const char *msg = "hello"; const size_t size = 5; write(msg, size); } Но теперь у меня другая ошибка:
Эм, затрудняюсь интерпретировать вывод линкера. Я неправильно использую параметр функции write в ассемблерной вставке?