setjmp / longjmp в x86_64-w64-mingw32 - PullRequest
       40

setjmp / longjmp в x86_64-w64-mingw32

0 голосов
/ 10 декабря 2018

Некоторое время назад было известно, что setjmp / longjmp в mingw-w64 не работает (http://www.agardner.me/golang/windows/cgo/64-bit/setjmp/longjmp/2016/02/29/go-windows-setjmp-x86.html).

У нас есть устаревший код, который мы использовали для запуска в 32-битной Linux и 32-битной Windows, которая (до сих пор) работает нормально. 64-битная версия Linux также работает нормально, но 64-битная версия Windows ломается после первого longjmp обратно в расположение setjmp.

Я получаю segfault где-то в msvcrt! _setjmpex, msvcrt! RtlUnwindEx.

Я изучил код и изначально не могу заметить каких-либо нарушений правил, определенных для setjmp / longjmp стандартами C (99/11) в нашем коде. Обходной путь, описанный выше ("используйте встроенные функции gcc"), также не делаетработа для меня.

У меня проблемы с созданием минимального воспроизводимого примера. Пример работает. Полного кода нет. Конечно, я могу начать удалять функциональность из полного исходного кода, но это не простая задача.

Итак, вопрос здесь в основном, является ли setjmp / longjmp в mingw-w64 известным (все еще) неработающим?

1 Ответ

0 голосов
/ 12 декабря 2018

Да, похоже, что setjmp / longjmp по-прежнему не работает для некоторого кода, скомпилированного с помощью компилятора x86_64-w64-mingw32.Это работает для более простого теста, я попытался воспроизвести проблему с.Поэтому, если вы столкнетесь с этой проблемой longjmp / setjmp, попробуйте вместо этого использовать __builtin_setjmp и __builtin_longjmp (как объяснено здесь ).

Моя ошибка заключалась в переопределении макросов longjmp / setjmp, поэтому я мог выбрать, какую версиюиспользовать простым определением, но отсутствует, чтобы сделать это везде.Это заставило скомпилированную программу использовать как встроенную, так и библиотечную версии, которые несовместимы.

...