gfortran pour les nuls: Ce n'mcmodel=moyen de faire exactement?

J'ai un code qui me donne de la relocalisation des erreurs lors de la compilation, ci-dessous est un exemple qui illustre bien le problème:

  program main
  common/baz/a,b,c
  real a,b,c
  b = 0.0
  call foo()
  print*, b
  end

  subroutine foo()
  common/baz/a,b,c
  real a,b,c

  integer, parameter :: nx = 450
  integer, parameter :: ny = 144
  integer, parameter :: nz = 144
  integer, parameter :: nf = 23*3
  real :: bar(nf,nx*ny*nz)

  !real, allocatable,dimension(:,:) :: bar
  !allocate(bar(nf,nx*ny*nz))

  bar = 1.0
  b = bar(12,32*138*42)

  return
  end

De la compilation avec gfortran -O3 -g -o test test.f, j'obtiens l'erreur suivante:

relocation truncated to fit: R_X86_64_PC32 against symbol `baz_' defined in COMMON section in /tmp/ccIkj6tt.o

Mais cela fonctionne si j'utilise gfortran -O3 -mcmodel=medium -g -o test test.f. Notez également qu'il fonctionne si je fais le tableau affectables et les répartir au sein de la sous-routine.

Ma question est qu'est-ce exactement ne -mcmodel=medium faire? J'étais sous l'impression que les deux versions de code (l'une avec allocatable tableaux et l'autre sans) ont été plus ou moins équivalent ...

OriginalL'auteur mgilson | 2012-10-16