Я портирую DLL из Windows в Linux (на самом деле OS X).
Я использовал это Статья StackOverflow чтобы сделать это изменение.
то есть я перенес Windows «bool DllMain ()» в Linux:
__attribute__((constructor)) void dllLoad();
__attribute__((destructor)) void dllUnload();
… но оба типа void возвращаются. Мне нужно иметь возможность сделать то же самое, что и Windows, и вернуть FALSE, если в конструкторе не выполнено условие, так что dlopen () завершается ошибкой, а .so не загружается.
Как мне заставить вызывающую dlopen () потерпеть неудачу?
Ответ в том, что это невозможно.
Как сказано выше, вы не можете ошибиться в конструкторе — будь то исключение или выход ()
Вам нужно подходить к этому по-другому.
Если вы динамически загружаете библиотеку, вы также должны использовать GetProcAddress () и dlsym (), чтобы фактически что-то с ней делать. dlsym () — ваш путь вперед.
Вы четко контролируете код плагина, так как в противном случае вы даже не можете добавить эти API к нему. Таким образом, все, что нужно сделать вашей dllmain на любой платформе, это установить некоторую глобальную информацию о состоянии «действителен». Затем вы просто вызываете известный API, такой как «ModuleIsValid ()», вся задача которого состоит в том, чтобы просто прочитать информацию о состоянии & вернуть истину / ложь. Если он возвращает false, вы закрываете библиотеку и сообщаете об ошибке.