c / c ++ Linux-эквивалент «bool DllMain ()» — но мне нужно вернуть неудачу dlopen ()

Я портирую DLL из Windows в Linux (на самом деле OS X).
Я использовал это Статья StackOverflow чтобы сделать это изменение.

то есть я перенес Windows «bool DllMain ()» в Linux:

__attribute__((constructor)) void dllLoad();

__attribute__((destructor)) void dllUnload();

… но оба типа void возвращаются. Мне нужно иметь возможность сделать то же самое, что и Windows, и вернуть FALSE, если в конструкторе не выполнено условие, так что dlopen () завершается ошибкой, а .so не загружается.

Как мне заставить вызывающую dlopen () потерпеть неудачу?

4

Решение

Ответ в том, что это невозможно.
Как сказано выше, вы не можете ошибиться в конструкторе — будь то исключение или выход ()

3

Другие решения

Вам нужно подходить к этому по-другому.

Если вы динамически загружаете библиотеку, вы также должны использовать GetProcAddress () и dlsym (), чтобы фактически что-то с ней делать. dlsym () — ваш путь вперед.

Вы четко контролируете код плагина, так как в противном случае вы даже не можете добавить эти API к нему. Таким образом, все, что нужно сделать вашей dllmain на любой платформе, это установить некоторую глобальную информацию о состоянии «действителен». Затем вы просто вызываете известный API, такой как «ModuleIsValid ()», вся задача которого состоит в том, чтобы просто прочитать информацию о состоянии & вернуть истину / ложь. Если он возвращает false, вы закрываете библиотеку и сообщаете об ошибке.

1

По вопросам рекламы [email protected]