Передача исключений через границы DLL / SO - PullRequest
0 голосов
/ 02 августа 2020

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

Я обнаружил, что обработка исключений ABI стандартизирована на Linux ( Itanium C ++ ABI: Обработка исключений ) и Windows ( Обработка исключений x64 ).

Также, насколько я понимаю, выравнивание данных также стандартизировано ( Двоичный интерфейс приложения System V Архитектура AMD64 Дополнение к процессору , соглашения о программном обеспечении x64 ).

  • Целевые архитектуры: amd64 , AArch64 ;
  • Целевые платформы: Linux, Windows.

Могу ли я использовать исключения или мне нужно обрабатывать их на границах DLL / SO ?

Могу ли я использовать исключения, если исполняемая и разделяемая библиотеки используют разные компиляторы ( MSV C и G CC или G CC и MSV C соответственно)

1 Ответ

1 голос
/ 02 августа 2020

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

Например, ваш тип исключения может иметь член std :: string, но std: : string может быть реализован по-разному от одной стандартной версии библиотеки к другой. Если ваш библиотечный модуль был скомпилирован со старым набором инструментов, а клиентская программа - с более новой версией, исключение будет заполнено объектами, соответствующими старой реализации, но программа затем попытается получить к нему доступ, как если бы это была новая реализация.

Честно говоря, это верно почти для всех типов C ++, не относящихся к POD, а не только для исключений. Можно использовать объекты C ++ вне границ библиотеки, но, как правило, только при условии, что весь код скомпилирован и компонован с использованием тех же инструментов и стандартных библиотек. Вот почему, например, есть бинарные файлы boost для всех основных версий MSV C.

Я полагаю, вам удастся избежать выброса типа исключения POD, который не является производным от std :: exception, но это было бы очень ограничено (например, потребовалось бы поймать точный тип).

...