Я могу примерно воспроизвести сообщаемое поведение с помощью следующей программы:
#include <unistd.h>
int main (void) {
sleep(1);
return 0;
}
void _start (void) {
asm("call main;"
"mov %eax,%ebx;"
"movl $1,%eax;"
"int $0x80;");
}
Но он должен быть скомпилирован с -nostdlib
. Из этого TIO примера я получаю:
/tmp/ccfjKQV4.o: In function `main':
.code.tio.c:(.text+0xa): undefined reference to `sleep'
collect2: error: ld returned 1 exit status
Что очень близко соответствует выводу, о котором вы сообщаете. Чтобы это исправить, вам нужно указать libc
при связывании программы. Это может быть достигнуто путем добавления -lc
, как показано на этом примере TIO . Но, если вы используете -nostdlib
, , это решение может быть нежизнеспособным (подробнее об этом позже).
_start
Пример программы, которую я предоставил, является примером того, как создать программу для x86 linux, которая будет вызывать main
, а затем вызывать exit
без необходимости использования среды выполнения C. Без стандартной среды выполнения C linux будет пытаться перейти к процедуре под названием _start
. Поскольку библиотеки C нет, exit
вызывается через сборку.
-nostdlib
Параметр -nostdlib
указывает компилятору не включать стандартные библиотеки времени выполнения C и библиотеки C при сборке исполняемого файла. Это иногда используется при разработке встроенного программного обеспечения, где встроенная платформа имеет собственную среду выполнения. Если это программное обеспечение предназначено для работы на встроенной платформе, может быть ошибочно включать -lc
в линию связи, поскольку это может вызвать помехи для библиотеки встроенной системы. В этом случае вам может потребоваться реализовать собственную версию sleep
или найти другой способ приостановить вашу программу.