Как CPython расширения могут вызывать функции, определенные внутри CPython? - PullRequest
0 голосов
/ 31 марта 2020

В документации для написания CPython расширений можно найти следующий код:

static PyObject *
spam_system(PyObject *self, PyObject *args)
{
    const char *command;
    int sts;

    if (!PyArg_ParseTuple(args, "s", &command))
        return NULL;
    sts = system(command);
    return PyLong_FromLong(sts);
}

Как мы видим, эта функция во внешнем C расширение может использовать функцию, определенную (я думаю) внутри основного CPython исходного кода интерпретатора: PyArg_ParseTuple.

Если бы мы просто создавали исходный файл расширения напрямую (он же *) 1009 *, et c.), Даже при включении необходимого заголовка <Python.h> компоновщик будет жаловаться на undefined reference to PyArg_ParseTupe.

Так как же построены CPython расширения, в некотором роде что позволяет им свободно ссылаться на функции из кодовой базы CPython?

Созданы ли расширения вместе с исходным кодом фактического интерпретатора? Связаны ли они с объектными файлами реального интерпретатора? Другой подход?

Пожалуйста, обратитесь к подходу, относящемуся к Windows. Дополнительная информация о Linux также приветствуется.

1 Ответ

1 голос
/ 31 марта 2020

Ну, в Linux соответствующий библиотечный вызов - dlopen(), где "dl" обозначает Dynami c Linking. На странице руководства написано :

Если исполняемый файл был связан с флагом "-rdynamic" (или, как синоним, "--export-dynamic"), тогда глобальные символы в исполняемый файл также будет использоваться для разрешения ссылок в динамически загружаемой библиотеке.

Другими словами, ссылки изнутри загруженной динамической c библиотеки разрешаются во время загрузки с помощью динамического c компоновщика.

...