Именованный общий блок в общей библиотеке

Я сталкиваюсь с проблемой, когда включаю подпрограмму Fortran в общую библиотеку. Эта подпрограмма имеет именованный общий блок.

У меня есть основная программа на Фортране, которая использует этот общий блок и связывается с общей библиотекой.

Поведение состоит в том, что переменные в общем блоке, установленном в подпрограмме или основной программе, не разделяются между ними.

Я использую gfortran 4.9.3 под MinGW на Windows. Вот кусочки моего очень простого примера.

Основная программа:

  program mainp
  common/whgc/ivar
  ivar = 23
  call sharedf
  end

Подпрограмма:

  subroutine sharedf
  common/whgc/ivar
  print *, 'ivar=', ivar
  end

Makefile:

FC = gfortran
FFLAGS=-g

all: shltest.dll mainp.exe

shltest.dll: sharedf.o
    $(FC) -shared -o  shltest.dll sharedf.o

mainp.exe: mainp.o shltest.dll
    $(FC) -o mainp.exe mainp.o shltest.dll

clean:
    rm *.o mainp.exe shltest.dll

когда mainp.exe работает, он производит ivar = 0 вместо правильного ivar=23Вот результаты некоторых экспериментов, которые я провел с nm,

nm -g mainp.o shows:
...
 00000004 C _whgc_
 nm on sharedf.o shows the same.
 nm -g shltest.dll shows:
 ...
 71446410 B _whgc_
 nm -g mainp.exe shows:
 ...
 00406430 B _whgc_

Это единственный _whgc_ символ в mainp.exe.

Тем не менее, когда я бегу mainp.exe в GDB и установить точки останова в обоихmainp а также sharedfЯ могу напечатать адрес ivar в каждой точке разрыва. Адреса не совпадают.

Из поведения кажется очевидным, что GNU ld неправильно соответствует _whgc_ символы, но мне неясно, какие параметры нужно передать либо в сборке совместно используемой библиотеки, либо в окончательной ссылке, чтобы сделать это?

(Пожалуйста, не предлагайте альтернативы общим блокам. В моем реальном приложении я имею дело с устаревшим кодом, который использует общие блоки.)

РЕДАКТИРОВАТЬ:

Я попробовал мой пример на Linux/x86, и там поведение правильное. Конечно, в Linux разделяемая библиотека и исполняемый файл являются объектами формата ELF, а в Windows/MinGW - PE/COFF.

0 ответов

Другие вопросы по тегам