LINUX.ORG.RU

MinGW, Borland и C++ ABI


0

0

Передо мной стоит задача со следующими начальными условиями:

1) Я пишу программу на C++ :-)

2) Я использую GNU/Linux.

3) В результате надо получить вендовый exe.

4) Программа линкуется с вендовой C++ dll, откомпилированной в Borland.

Таким образом, я использую MinGW (пакеты xmingw-* в Gentoo, gcc-3.4.2) для кросс-компиляции в венду. Компиляция происходит успешно, однако линковка, как и следовало ожидать, обламывается с многочисленными undefined reference на функции из Borland'овской dll. Мой вопрос состоит в следующем: как мне добиться совпадения mangling и совместимости ABI с Borland? Возможно ли это вообще, или мне стоит забыть об этом? :-) Наверняка gcc имеет массу ключей для этого, только вот я чувствую, что "ниасилю" всю эту информацию в сколь-нибудь приемлемый срок, т. к. в компиляторах на низком уровне практически не разбираюсь :-( Может у кого есть ссылка какая-нибудь волшебная, а еще лучше приблизительное готовое решение завалялось? :-)

anonymous

> Мой вопрос состоит в следующем: как мне добиться совпадения mangling и совместимости ABI с Borland

никак. Забудь. G++ не совместим и не будет совместим с Borland C++.

Вообще надо сваять С-level API для той библиотеки и это API использовать.

Begemoth ★★★★★
()

Программы пишут на С, на С++ пишут интерфейс и прочие перделки. Отсюда вывод - делай внутри либы врапперы из С++ в С, а в проге - из С в С++ и используй.

Gharik
()
Ответ на: комментарий от Begemoth

>Вообще надо сваять С-level API для той библиотеки и это API использовать.

Я анонимус, задавший вопрос. Несмотря на то, что библиотека на C++, она состоит из функций, объявленных как extern "C". Это мне поможет? :-) То есть мне надо справиться только с mangling? А, скажем, порядок передачи параметров через стек и все такое?

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

Гм. А если скачать и поставть mingw под винды?

Ну и естественно c++-ные символы, объявленные как глобальные в борландовской либке в данном случае есть зло.

Еще, в принципе, можно посмотреть, по каким правилам делает mangling имен у борланда и сваять враппер на асме, поименовав важдую функцию руками :)

Gharik
()
Ответ на: комментарий от anonymous

имена функций, объявленные как extern "C" не должны искажаться, хотя может Borland C++ _ добавляет в начало имени?

Порядок передачи параметров ЕМНИП совпадает, а вообще info gcc раздел "C Extensions/Function Attributes" (примерно - писал по памяти).

Еще проблемой может быть выравнивание структур - кка с этим не помню.

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

И получить кучу проблем из-за разницы внутренней организации классов, исключительных ситуаций...

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

>Гм. А если скачать и поставть mingw под винды?

У меня сейчас нет доступа к винде. Да и, думаю, это будут те же яйца вид сбоку :-)

>Ну и естественно c++-ные символы, объявленные как глобальные в борландовской либке в данном случае есть зло.

Это как так? Вроде бы речь и шла о враппере на C, а он и выглядел бы именно так.

>Еще, в принципе, можно посмотреть, по каким правилам делает mangling имен у борланда и сваять враппер на асме, поименовав важдую функцию руками :)

Пример. Библиотека foo.dll. Функция называется blah(). Линкер пишет: undefined reference to `__imp__blah@0'. В foo.dll и foo.lib я нашел только blah, без манглинга вообще. И как с этим быть?

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

Попробуй посмотреть как называются символы в библиотеке(вроде objdump в minGw есть). Можно загружать либу динамически и получать функции по символам.

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

>Попробуй посмотреть как называются символы в библиотеке(вроде objdump в minGw есть).

$ /opt/xmingw/bin/i386-mingw32msvc-objdump -tr maptag.dll

maptag.dll: формат файла pei-i386

SYMBOL TABLE: нет символов

anonymous
()
Ответ на: комментарий от YesSSS

>Попробуй -T.

$ /opt/xmingw/bin/i386-mingw32msvc-objdump -T maptag.dll

maptag.dll: формат файла pei-i386

/opt/xmingw/bin/i386-mingw32msvc-objdump: maptag.dll: не динамический объект

DYNAMIC SYMBOL TABLE: нет символов

>Еще вроде в MSVC указывается __declspec (dllexport) перед функцией, про борланд не знаю.

Да, это так, функции в этой библиотеке объявляются таким образом:

#define DLL_EI __declspec(dllexport)

<...>

extern "C" unsigned long _stdcall DLL_EI GetRegisterID();

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