Используя идентичные исходные файлы для Fortran.dll, я могу скомпилировать их с помощью Compaq Visual Fortran 6.6C или Intel Visual Fortran 12.1.3.300 (IA -32 ). Проблема в том, что выполнение не выполняется на бинарном файле Intel, но хорошо работает с Compaq. Я компилирую 32 -бит в 64 -битной системе Windows 7. Драйвер вызова.dll написан в C#
.
Сообщение об ошибке исходит от страшного_chkstk()
вызов, когда вызывается внутренняя подпрограмма (вызывается из подпрограммы ввода.dll ). (SO ответ наchkstk()
)
Рассматриваемая процедура объявлена как (извините за фиксированный формат файла)
SUBROUTINE SRF(den, crpm, icrpm, inose, qeff, rev,
& qqmax, lvtyp1, lvtyp2, avespd, fridry, luin,
& luout, lurtpo, ludiag, ndiag, n, nzdepth,
& unit, unito, ier)
INTEGER*4 lvtyp1, lvtyp2, luin, luout, lurtpo, ludiag, ndiag, n,
& ncp, inose, icrpm, ier, nzdepth
REAL*8 den, crpm, qeff, rev, qqmax, avespd, fridry
CHARACTER*2 unit, unito
и называется так:
CALL SRF(den, crpm(i), i, inose, qeff(i), rev(i),
& qqmax(i), lvtyp1, lvtyp2, avespd, fridry,
& luin, luout, lurtpo, ludiag, ndiag, n, nzdepth,
& unit, unito, ier)
с аналогичными спецификациями переменных, за исключением массивов crpm
, qeff
, rev
и qqmax
, в которых для каждого вызова SRF()
используются только элементы i-th
.
Я понимаю возможные проблемы со стеком, если размер аргументов превышает 8kb
, но в этом случае у нас 7 x real(64) + 11 x int(32) + 2 x 2 x char(8) = 832 bits
только в передаваемых аргументах.
Я очень много работал, чтобы переместить аргументы (, особенно массивы )в модуль, но я продолжаю получать ту же ошибку
.
Разборка из Intel .dll
Разборка из Compaq .dll это
Может ли кто-нибудь предложить какие-либо предложения о том, что вызывает SO или как его отладить?
PS. Я увеличил зарезервированное пространство стека до сотен Mb
, и проблема не устранена. Я попытался пропустить вызов chkstk()
в дизассемблере, но программа вылетает. Проверка стека начинается с адреса 0x354000
и повторяется до 0x2D2000
, где происходит сбой при доступе к защитной странице.Нижний адрес стека — 0x282000
.