Как можно безопасно реализовать набор функций C как библиотеку с самоинициализацией? - PullRequest
0 голосов
/ 09 сентября 2018

Мне никогда не удавалось найти каких-либо четких, кратких и полных объяснений по созданию и использованию библиотек на C; динамический / общий и статический.

По нескольким причинам я хотел бы реализовать некоторые из моих заголовочных файлов C для проекта, над которым я работаю, в виде библиотек. Каждая библиотека может иметь глобальную структуру, выполняющую роль пространства имен для статических функций в заголовках, и функцию ввода для инициализации этой структуры.

struct mylibrary {
    int (*function1)(void);
    int (*function2)(void);
} mylibrary;

static int my_library_function_1 (void) {
    return 1;
}

static int my_library_function_2 (void) {
    return 2;
}

void entry_mylibrary (void) {
    mylibrary.function1 = my_library_function_1;
    mylibrary.function2 = my_library_function_2;
}

Насколько я понимаю, это должно работать без проблем со статической библиотекой. Все, что мне нужно сделать, это связать библиотеку и вызвать функцию entry_mylibrary из другого места в моей программе. Однако я хотел бы, чтобы мои библиотеки были самоинициализирующимися; то есть я хочу, чтобы функция ввода вызывалась при загрузке кода. Насколько я понимаю, это домен разделяемых библиотек, который может объявлять точки входа, которые будут выполняться при загрузке библиотеки.

Так почему бы мне просто не создать динамические библиотеки?

Что ж, меня беспокоит безопасность приложений. Если я просто связываю библиотеку во время выполнения, я не вижу, что мешает некоторым конечным пользователям менять мою библиотеку на свои собственные. Не могу ли я создать новую библиотеку, объявляющую те же переменные, что и старую, и поменять определения этих переменных на мои собственные? Я не понимаю, почему исполняемый файл будет заботиться.

Полагаю, мои вопросы:

  • Есть ли какой-то неясный метод для самостоятельной инициализации статической библиотеки?
  • Как я могу убедиться, что загружаемая (общая) библиотека действительно МОЯ библиотека?

Я / буду работать кроссплатформенно. 64-битная Windows и Linux. Продукты Apple подлежат определению, но не являются приоритетом.

Я использую сообщество Visual Studio 2017 в Windows 10. Я буду использовать GCC для Linux. Я буду реализовывать одни и те же библиотеки на всех платформах с помощью компиляторов платформы, например, VS 2017 на Windows и GCC на Linux; Я не буду кросс-компилировать код для конкретной платформы.

1 Ответ

0 голосов
/ 09 сентября 2018

Есть ли какой-то неясный метод для самостоятельной инициализации статической библиотеки?

С GCC это неясно: просто используйте __attribute__((constructor)). С MSVC это немного сложнее, но все же возможно: __ атрибут __ ((конструктор)) эквивалент в VC?

Как я могу убедиться, что загружаемая (общая) библиотека действительно МОЯ библиотека?

С учетом вышеизложенного вам не нужно использовать общую библиотеку.

...