Как устранить ошибку GHC "Неизвестное имя раздела PEi386`.idata$4' "в Windows?
Недавно я обнаружил, что инструкции, которые я написал для компиляции HDBC-postgresql в Windows, больше не работают с Haskell Platform 2012.2.0.0. Библиотека собирается нормально, но при попытке связать встроенную библиотеку, cabal
не удается с:
Загрузка пакета HDBC-postgresql-2.3.2.1 ... ghc.exe: неизвестное имя раздела PEi386 `.idata$4' (при обработке: C:/PROGRA~1/POSTGR~1/9.2/lib\libpq.a) ghc.exe: паника! (случилось "невозможное") (GHC версия 7.4.1 для i386-unknown-mingw32): loadArchive "C:/PROGRA~1/POSTGR~1/9.2/lib\\libpq.a": не удалось
Я пробовал переделывать libpq.a
с dlltool --no-idata4 --no-idata5
, но затем сообщение об ошибке изменилось на Unknown PEi386 section name `.idata$7'
,
Это похоже на ошибку GHC 7103.
В соответствии со спецификацией PE и COFF знак доллара имеет особое значение при включении в названия разделов, обозначая "сгруппированный раздел". Предполагается, что компоновщик отбрасывает "$" и все последующие символы для создания объединенного .idata
раздел, где символы, следующие за "$", используются для определения порядка вкладов в объединенный раздел.
Есть ли способ заставить dlltool
не выводить сгруппированные разделы?
Альтернативно, есть ли способ взять архив GNU (файл), объединить все сгруппированные разделы и вывести полученную объединенную библиотеку импорта (implib)?
РЕДАКТИРОВАТЬ: та же ошибка происходит с Haskell Platform 2012.4.0.0.
РЕДАКТИРОВАТЬ2 После просмотра исходного кодаdlltool
, кажется, нет способа заставить его не выводить сгруппированные разделы. Кроме того, я не нашел готовую утилиту, которая объединит сгруппированные разделы в объектном файле.
В целях вознаграждения и этого вопроса я изменяю его на: Как построить единый .idata
В разделе дан файл определения модуля (DEF).
1 ответ
Предполагается, что компоновщик отбрасывает "$" и все последующие символы, чтобы создать объединенный раздел.idata.
Да, но это только стандартное поведение компоновщика Microsoft. Мне не хватает скорости на вашей цепочке инструментов, так что просто некоторые подсказки. Для компоновщика gcc требуется явная конфигурация для объединения различных разделов.idata$x в один раздел.idata. Это сделано с помощью директивы СЕКЦИИ. В mingw, который, кажется, выполняется сценарием, образец доступен здесь. Обратите внимание на эту часть сценария:
.idata BLOCK(__section_alignment__) :
{
/* This cannot currently be handled with grouped sections.
See pe.em:sort_sections. */
SORT(*)(.idata$2)
SORT(*)(.idata$3)
/* These zeroes mark the end of the import list. */
LONG (0); LONG (0); LONG (0); LONG (0); LONG (0);
SORT(*)(.idata$4)
__IAT_start__ = .;
SORT(*)(.idata$5)
__IAT_end__ = .;
SORT(*)(.idata$6)
SORT(*)(.idata$7)
}
Довольно непостижимо, но обувь подходит. Убедитесь, что ваш компоновщик использует такой скрипт.