LINUX.ORG.RU

dynamic_cast и динамические библиотеки.


0

0

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

ЗЫ: В упор не понимаю НАХРЕНА троли изобрели велик по имени qobject_cast, объясните кто на пальцах плиз!

если грузить библиотеку из другой билиотеки через dlopen, а потом в основном бинарнике кастовать объект, используя интерфейсы этих библиотек - dynamic_cast может вернуть NULL, но это ес-но решается на уровне ключей компилятора/линковщика

lester ★★★★
()
Ответ на: комментарий от namezys

Кинь примерчик если не сложно, а то у меня чето не получается заставить dynamic_cast вернуть 0 на легитимном преобразовании (когда он 0 возвращать не должен). Вопрос то простой: чего именно нужно сделать чтобы RTTI не сработало?!

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

Береш дефолтовый qmake. Далаешь плагин. Далаешь приложение. Грузишь с нем плагин: dynamic_cast не работает. Могу рассказать почему

namezys ★★★★
()
Ответ на: комментарий от mskmsk1985

По стандарту С++ 2 типа являются один и тем же, если полные идентификаторы типа равны посимвольный. Долгое время так и было (до gcc 3, где поменяли ABI)

Очевидно, что такое сравнение несколько трудоемко. Поэтому стали использовать что-то (что сводится скорей всего к целочисленному типу). Так вот, компилятор, собирая библиотеку А, не знает, какие идентификаторы типу будут даны в программе В - в результате это считается разными типами.

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

Мы в mdc используем именно dynamic_cast и только его

namezys ★★★★
()
Ответ на: комментарий от LamerOk

смысл передал. Детали ABI не особо интересовали, зато как ее развернуть с qt так, чтоб работало и собиралось - было важно

namezys ★★★★
()
Ответ на: комментарий от namezys

1 - прости но ABI к стандарту по С++ не имеет никакого отношения, это совсем отдельная песьня.
2 - «Так вот, компилятор, собирая библиотеку А, не знает, какие идентификаторы типу будут даны в программе В - в результате это считается разными типами». Ну есть такая весчь как Dynamic Symbol Table которую линкер пользует при связывании библиотек и вот так просто получается ОДИН тип равный сам себе со всех сторон! И как следствие и dynamic_cast мило себе работает сколько so объекты не линкуй.

Теперь фокус:
При DST бинарника строиться при компановке и на этом этапе известно какую дряны в либу пихают а какую нет. Обмануть сие можно передавая указатели на объекты как уже прикастованные к void* - но это уже случай из психиатрички. А вот Qt свои плагины грузит dlopen и Ко, уже после создания бинарника и нужных типов в DST нет, и как итог есть одна vtbl для класса A в бинарники и другая vtbl для класса А в либе. А по нынешнему ABI dynamic_cast сравнивает указатели на vtbl а их две и указатели будут разные и типы разные.

PS:
Только вся эта хрень с dlopen решается передачей опции -Е линкеру при сборке бинарника - так нафиг велик изобретать с новым видом преобразования, короче вопрос остался...

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

-E появился не сразу - это раз qobj_cast работает при отказе от использования rtti

ЗЫ: а я что другое написал? просто названия я не знаю

namezys ★★★★
()
Ответ на: комментарий от namezys

Да в общих чертах тоже, просто вдруг какому пытливому уму будут интересны детали...

ЗЫ: Да еще надо чтобы версии ABI совпадали. У gcc 4.3 и 4.4 они например разные.

mskmsk1985
() автор топика
Ответ на: комментарий от UVV

это как? qobject_cast использует текстувую систему типов - работает всегда. Или вы не описали все необходимые макросы?

namezys ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.