重定位溢出与常见部分

时间:2018-02-23 10:05:18

标签: memory fortran overflow intel-fortran relocation

我有一个项目,其中我有一个主程序main.f95,它使用一堆模块:main.f95调用的每个子程序都包含在它自己的模块中。我这样做是为了避免接口阻塞。

还有两个额外的模块:global.f95包含8个声明为参数的标量整数,Param.f95包含33个标量实数(使用NAG工作精度,即double)。最后,上面提到的一个子例程Set_Param.f95将值赋给Param.f95中声明的标量。这恰好发生在main.f95的开头。

最后,我使用的是NAG Fortran库(标记26)和ifort64-18。

我在编译时遇到以下错误(链接?):

Set_param_mod.o: In function `set_param_mod_mp_set_param_':

Set_param_mod.f95:(.text+0x47): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_rho_i_' defined in COMMON
section in Param.o

Set_param_mod.f95:(.text+0x73): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_theta_' defined in COMMON
section in Param.o

Set_param_mod.f95:(.text+0x84): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_delta_k_' defined in COMMON
section in Param.o

Set_param_mod.f95:(.text+0x95): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_delta_i_' defined in COMMON
section in Param.o

Set_param_mod.f95:(.text+0xa6): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_theta_i_' defined in COMMON
section in Param.o

Set_param_mod.f95:(.text+0xb7): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_theta_k_' defined in COMMON
section in Param.o

Set_param_mod.f95:(.text+0xc8): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_c_e_' defined in COMMON section
in Param.o

Set_param_mod.f95:(.text+0xd2): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_wage_' defined in COMMON
section in Param.o

Set_param_mod.f95:(.text+0xde): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_csi_' defined in COMMON section
in Param.o

Set_param_mod.f95:(.text+0xea): relocation truncated to fit:
R_X86_64_PC32 against symbol `param_mp_b1_' defined in COMMON section
in Param.o

Set_param_mod.f95:(.text+0xf6): additional relocation overflows
omitted from the output

如果我正确读取此权限,则Set_Param.f95尝试将值分配给Param.f95中的相应标量变量时会发生溢出。

在这里和英特尔开发人员论坛上阅读其他主题,看起来这应该只有在我有> 2GB的静态数据时才会发生(可能在COMMON块中,我没有;加上,如上所列上面,我的变量远不及2GB)。此外,这些主题给出的主要处方是:

  

i)在主程序中声明所有可分配的大数组(哪个   我弄完了;但是,我还没有声明它们是可分配的   个别子程序)和

     

ii)在模块中声明所有数据(我也已经完成)

有些回答提到问题可能出现在“全局”变量上,我不确定它们在Fortran中的意思,特别是因为上面的处方ii)。

鉴于我在这一点上很丢失,我想知道问题是否源于将每个子程序放在一个单独的模块中,将临时数组放在“全局”中,无论在其他线程中意味着什么?

还有其他潜在客户?

0 个答案:

没有答案