Неопределенный символ "_clone" в OS X - PullRequest
1 голос
/ 15 июня 2019

Код:

#include <stdio.h>
#include <sched.h>
#include <stdlib.h>
#include <sys/wait.h>

#define _GNU_SOURCE

void *stack_memory() 
{
    const int stackSize = 65536;
    void* stack = (void*)malloc(stackSize);
    if (stack == NULL) {
        printf("%s\n", "Cannot allocate memory \n");
        exit(EXIT_FAILURE);
    }
    return stack;
}

int jail(void *args) 
{
    printf("Hello !! - child \n");
    return EXIT_SUCCESS;  
}

int main()
{
    printf("%s\n", "Hello, world! - parent");
    clone(jail, stack_memory(), SIGCHLD, 0);
    return EXIT_SUCCESS;
}

Ошибка:

Неопределенные символы для архитектуры x86_64: "_clone", ссылка от: _main in docker-4f3ae8.o ld: символы не найдены для архитектуры x86_64 clang: error: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова)

1 Ответ

0 голосов
/ 15 июня 2019

Linux не ставит символы перед префиксом _, поэтому вы не используете Linux.

Но системный вызов clone(2) специфичен для Linux, согласно его справочной странице .

clone () специфичен для Linux и не должен использоваться в программах, предназначенных быть переносимым.


Возможно, вы используете OS X или что-то в этом роде. И вы компилируете как C, поэтому вызов необъявленной функции не является ошибкой во время компиляции (просто большое предупреждение). Вот почему это ошибка компоновщика, а не ошибка времени компиляции (и вы проигнорировали предупреждения компилятора.)

И, кстати, #define _GNU_SOURCE после , включая заголовочные файлы, не имеет смысла. Вы должны определить макросы запроса возможностей до , включая заголовки, чтобы они могли определять прототипы для функций только для GNU в тех случаях, когда это уже не по умолчанию.

...