Сбой на jmpq для функции в другой dll с mingw64

Я переношу свой проект с 32 на 64 бита в Windows, используя mingw64.

Все компилируется/связывается нормально, однако у меня есть некоторые проблемы во время выполнения: программа падает при вызове функций, на которые ссылается другая DLL, например. по такой инструкции:

0x574040   ff 25 e8 66 6a 00   jmpq *0x6a66e8(%rip)   # 0xc1a72e <_ZN12QTableWidget18currentCellChangedEiiii+638>

В приведенном выше примере используется функция Qt, вызываемая при запуске приложения, но у меня есть аналогичные проблемы с другими DLL.

Странная вещь: у меня проблема с библиотеками Qt DLL только в режиме выпуска (это означает, что я использую другой набор DLL, имена которых заканчиваются на 'd').

В режиме отладки у меня похожая проблема, но только с одной библиотекой. И с помощью этой библиотеки я смог динамически загружать функции (используя QLibrary) поэтому DLL не кажется недействительной.

Я провел целый день, пытаясь понять, что не так, но у меня нет дополнительных идей:

  • Файлы DLL и исполняемые файлы отображаются как «формат файла pei-x86-64» при их objdump.
  • Предполагается, что они были скомпилированы с помощью одного и того же компилятора (за исключением упомянутой мной дополнительной библиотеки, которая была скомпилирована с помощью MSVC, но имеет только интерфейс C)
  • Файлы DLL на самом деле присутствуют рядом с exe-файлом (иначе я бы столкнулся с осмысленной ошибкой «X.DLL отправляется с вашего компьютера»).

Если у кого-то есть какие-либо подсказки, пожалуйста, дайте мне знать!


person Arnaud    schedule 03.02.2015    source источник
comment
Этот пост помог мне: stackoverflow.com/questions /24641898/ и так: stackoverflow.com/questions/3573475/ Попытка связать dll напрямую устранила проблему. Но мне интересно, почему использование .lib не работает, хотя работало с 32 битами. Кроме того, для Qt, поскольку все генерируется автоматически, я не могу заставить ссылаться на файлы dll. Поэтому мне все еще интересно узнать, почему использование .lib, как я всегда делал, не работает.   -  person Arnaud    schedule 03.02.2015


Ответы (1)


Хорошо, на самом деле были проблемы:

  • для дополнительной библиотеки, скомпилированной с помощью MSVC, известна проблема, заключающаяся в том, что ссылка на .lib невозможна. Как сказано в комментариях, с gcc можно связать напрямую с DLL, чтобы решить проблему для меня для этой библиотеки.
  • У меня есть проблемы с другими библиотеками в режиме выпуска, но это была совершенно другая проблема: программное обеспечение, над которым я работаю, имеет механизм защиты, активируемый только в режиме выпуска, и это все испортило.
person Arnaud    schedule 06.02.2015