修复fortran公共重定位被截断以适合R_X86_64_32S和模块

时间:2016-04-11 14:59:14

标签: fortran relocation

我有一个围绕许多子例程编写的旧Fortran 77代码,每个子例程都在一个单独的文件中,并且它们广泛使用COMMON语句。我已经分析了代码,在我发现的18个总包含文件中,有两个是声明最大静态数组的重击者。 例如,我的global.par参数文件定义了

C  keep nodes/elements below 400000 / 600000 to prevent relocation
C  truncated to fit compiler error

   INTEGER MAXNODES
   PARAMETER ( MAXNODES = 1000000 )

   INTEGER MAXELEMS
   PARAMETER ( MAXELEMS = 4000000 )

然后这个参数文件我现在包含两个重写的包含文件,我把它变成了模块。但是,在声明静态数组(例如

)方面,这些新模块文件中的每一个都执行与以前相同的所有操作
      C this module file name is aa_module.f

      MODULE AA

      IMPLICIT NONE
      INCLUDE 'global.par'

      REAL    NODES   (3, MAXNODES)
      REAL    NODES2  (3, MAXNODES)
      INTEGER EL1     (12, MAXELEMS)
      INTEGER EL2     (12, MAXELEMS)
C     and so on, many more arrays based around MAXNODES & MAXELEMS

      END MODULE AA

当我编译并链接程序时,如果我保留MAXNODESMAXELEMS小的东西就行了。但我需要处理大型模型,所以当我抬起这些值时,我仍然会得到消息

  

重定位被截断以适合:对于符号的R_X86_64_32S ...在AA_module.o的COMMON部分中定义。

最佳解决方案是什么?我对Fortran的了解有限。

如果我创建一个名为Init_big_arrays的新子例程,并且ALLOCATE运行时模块AA中的所有数组都将解决此问题,请记住还有16个左右的其他包含根据{{​​1}}文件中的参数声明一堆静态整数和实数数组的文件,但其中最差的是global.parINTEGER ID(256,256)

0 个答案:

没有答案