Переполнение стека при вызове подпрограммы только при компиляции с помощью Intel Visual Fortran и нормально при компиляции с помощью Compaq Visual Fortran

Используя идентичные исходные файлы для 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только в передаваемых аргументах.

Я очень много работал, чтобы переместить аргументы (, особенно массивы )в модуль, но я продолжаю получать ту же ошибку

error.

Разборка из Intel .dll

intel

Разборка из Compaq .dll это

compaq

Может ли кто-нибудь предложить какие-либо предложения о том, что вызывает SO или как его отладить?

PS. Я увеличил зарезервированное пространство стека до сотен Mb, и проблема не устранена. Я попытался пропустить вызов chkstk()в дизассемблере, но программа вылетает. Проверка стека начинается с адреса 0x354000и повторяется до 0x2D2000, где происходит сбой при доступе к защитной странице.Нижний адрес стека — 0x282000.

6
задан Community 23 May 2017 в 12:06
поделиться