Я пытаюсь создать общий объект с MinGW (в данном случае с DLL), который содержит набор функций, к которым я хочу получить доступ через список, сгенерированный компоновщиком, используя:
атрибут ((раздел ( "my_custom_section"))).
Я также хочу, чтобы моя таблица экспорта была свободна от чего-либо, кроме двух сгенерированных компоновщиком символов (__start_my_custom_section, __stop_my_custom_section).
Я пытался присвоить переменным внутри пользовательского раздела различные атрибуты, включая"используемый".Когда я проверяю dll с Уокером зависимости, я ничего не получаю.Я также пытался поставить
__declspec (dllexport) extern fp_t __start_my_custom_section;внутри файла заголовка.
Я действительно перепробовал все, что смог найти (видимость, gc-off и т. д.), но, похоже, ничего не работает.
//header.h
typedef void (* fp_t)(void);
#define ADD_FUNC(name) \
void function_##name(void); \
__attribute__((section("custom_section"))) \
fp_t function_##name##_data = function_##name \
void function_##name(void)
//source1.c
ADD_FUNC(foo)
{
//do stuff;
}
//source2.c
ADD_FUNC(bar)
{
//do stuff;
}
Основная проблема в том, что янужно сделать это внутри заголовка без привлечения дополнительного источника.
Это работает, пока есть переменная, инициализированная с __start / __ stop, но, очевидно, я не могу поместить переменную в заголовок, так как возникнет конфликт.
Другим решением было бы связать дополнительный исходный файл, содержащий эти переменные, но я бы хотел этого избежать.
По сути, я спрашиваю, есть ли способ заставить пользовательский компоновщиксгенерированные символы внутри таблицы экспорта dll, без использования файлов DEF или любых других дополнительных файлов, только с использованием одного заголовочного файла, который я включаю в [1..n] C-файлы, содержащие функции, которые получают указатель, добавленный в пользовательский раздел.