Именованный общий блок в общей библиотеке
Я сталкиваюсь с проблемой, когда включаю подпрограмму 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.