Время регистрации авторегистрации функций конструктора - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь создать сервис / демон, который облегчает запуск «апплетов» в своей оболочке процесса. Служба предоставляет функциональность через библиотеку, которую вызывают эти апплеты. Наиболее важно то, что здесь необходимо, чтобы все эти апплеты выполнялись в той же границе процесса, что и сама служба. Апплет также должен регистрироваться в службе при загрузке.

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

Один из вариантов здесь - собрать апплеты в виде разделяемых библиотек (.so), чтобы все они были помещены в целевую файловую систему в определенной папке, которая ищется службой при загрузке, загрузке все .so в этой папке динамически через dl_open. Помечая функцию init __attribute__((constructor)) в самом апплете, апплет получает возможность регистрироваться в службе во время инициализации.

Существует ли статическая версия / версия во время соединения? Я баловался с предложением здесь , но не могу помешать компилятору оптимизировать объект реестра глобальной функции, который экспортируется каждым апплетом. Использование -Wl,--whole-archive также не работает, поскольку он жалуется на множественное определение функций, предоставляемых библиотекой service / daemon при связывании двух или более таких библиотек апплетов.

1 Ответ

1 голос
/ 13 января 2020

Существует ли статическая версия или версия для канала связи?

Есть, но такое решение не удовлетворяет вашему требованию, что «служба может быть построена независимо от этих апплетов». ». С stati c, связывающим сервис, и все апплеты связаны друг с другом, и поэтому по определению не может быть построен отдельно.

Тем не менее, -Wl,--whole-archive является правильным решением к вашей проблеме.

тоже не работает, так как жалуется на множественное определение функций, предоставляемых библиотекой service / daemon

Не поместите библиотеку service / daemon в каждую из библиотек апплета (это не имеет смысла). Поместите это в свою собственную библиотеку вместо этого. Это должно работать:

gcc main.o -Wl,--whole-archive -lapplet1 -lapplet2 ... -lservice -Wl,--no-whole-archive
...