gpt4 book ai didi

arguments - 仅在使用 Intel Visual Fortran 编译时子程序调用堆栈溢出,在使用 Compaq Visual Fortran 编译时正常

转载 作者:行者123 更新时间:2023-12-04 15:35:54 24 4
gpt4 key购买 nike

使用 Fortran .dll 的相同源文件,我可以使用 Compaq Visual Fortran 6.6C 或 Intel Visual Fortran 12.1.3.300 (IA-32) 编译它们。问题是在 Intel 二进制文件上执行失败,但在 Compaq 上运行良好。我在 Windows 7 64 位系统上编译 32 位。 .dll 调用驱动写在 C# .

失败消息来自可怕的 _chkstk() 调用内部子例程时调用(从 .dll 入口例程调用)。 (所以回答 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 , revqqmax是数组,其中只有 i-th元素用于每个 SRF()称呼。

如果参数超过 8kb,我了解可能的堆栈问题大小,但在这种情况下,我们有 7 x real(64) + 11 x int(32) + 2 x 2 x char(8) = 832 bits仅在传递的参数中。

我非常努力地将参数(尤其是数组)移动到模块中,但我一直收到同样的错误

error .

来自 的拆解英特尔 .dll 是

intel

来自 的拆解康柏 .dll 是

compaq

任何人都可以就导致 SO 的原因或如何调试它提供任何建议吗?

PS。我已将保留的堆栈空间增加到数百个 Mb问题仍然存在。我试过跳过 chkstk()调用反汇编程序,但程序崩溃。堆栈检查从地址 0x354000 开始并向下迭代到 0x2D2000它在访问保护页面时崩溃。栈底地址为 0x282000 .

最佳答案

你正在射击信使。 Compaq 生成的代码也调用 _chkstk(),不同之处在于它内联了它。常见的优化。这两个片段之间的主要区别是:

 mov eax, 0D3668h

对比
 sub esp, 233E4h

您在此处看到的值是函数所需的堆栈空间量。 Intel 代码需要 0xd3668 字节 = 865869 字节。 Compaq 代码需要 0x233e4 = 144356。差别很大。在这两种情况下,这都是相当大的数量,但英特尔的一个变得至关重要,一个程序通常有一个 1 兆字节的堆栈。吞下 0.86 兆字节的内容非常接近,嵌套了几个函数调用,您正在查看该站点的名称。

你需要找出什么,我无能为力,因为它不在你的代码片段中,这就是为什么英特尔生成的函数需要这么多空间来存放它的局部变量。解决方法是使用免费存储为大型数组寻找空间。或者使用链接器的/STACK 选项来请求更多的堆栈空间(猜测选项名称)。

关于arguments - 仅在使用 Intel Visual Fortran 编译时子程序调用堆栈溢出,在使用 Compaq Visual Fortran 编译时正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10147028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com