Правильные obj-файлы для FPC

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Правильные obj-файлы для FPC

Сообщение Nik »

Решил на досуге приспособить для Lazarus библиотеку delphi.zlib, так как хочется иметь под рукой свежую реализацию этого алгоритма, а в составе FPC идёт какой-то совсем древний порт, даже не использующие оригинальные object'ы. Плюс, в своё время я вытащил из Jedy и немного доковырял напильником парочку очень удобных функций-обёрток, упрощающих сжатие файла/папки до вызова одной функции.

Сама либа компилится без проблем, но вот на obj-файлах компилятор клинит:

project1.lpr(20,1) Error: Illegal COFF Magic while reading Zlib\deflate.obj


Гугл подсказал решение: проблема в том, что обжекты собраны компилятором С Builder'а, а FPC кушает только выбросы Visual C и gcc. Мелкомягкий компилятор под рукой нашёлся, но легче от этого не стало, теперь FPC ругается на те же файлы по-другому:

project1.lpr(20,1) Error: Failed reading coff file, illegal reloctype $000A while reading Zlib\deflate.obj


Собственно, вопрос к знатокам. Как собрать obj-файлы оригинальной zlib, чтобы их скушал FPC. C gcc никогда особо не сталкивался (пару раз доводилось компилировать что-то консольное в Geany под Ubuntu). Пытался скормить Makefile.gcc из комплекта zlib утилите make из состава FPC - не прокатило, говорит:

c:\zlib-1.2.5\win32>make -f Makefile.gcc
make: *** No rule to make target `zlib.h', needed by `adler32.o'. Stop.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

v-t-l
Уже искал по запросу COFF. Куча советов по компиляции AMS-кода в правильные obj-файлы, и вообще ничего на тему компиляции с-кода.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

gcc для винды (mingw32+msys).
инструкции по компиляции zlib приблизительно:
запускаем msys
cd в папку с распакованными сырцами zlib
./configure
make

хотя обычно в комплекте идет файлик INSTALL с описанием, как что делать
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

2v-t-l
Спасибо за наводку. Скомпилировать исходники в правильный object-формат удалось. Но вот модуль всё равно не собирается :( Теперь при линковке obj-файлов ({$L Zlib\deflate.o}) FPC ругается так:

project1.lpr(20,1) Error: Undefined symbol: ZLIBEXAPI_DEFLATEINIT2_$crcB53E13EB


Самое странное, что таких названий вообще нет в исходниках (и object'ах) zlib. Что за ерунда такая, кто-нибудь знает?
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

В исходниках zlib их и не может быть, это FPC код чем-то недоволен.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Да я понимаю, что FPC. Только имена отсутствующих функций смущают: ZLIBEXAPI_DEFLATEINIT.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

zlibexapi - это имя модуля либо класса/объекта, deflateinit2 - имя процедуры, crc (которое дальше) означает, что у процедуры настолько много параметров, что их типы, записанные последовательно, не влезут в ограничение на 127 символов.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Ну, что это такое, в целом, ясно. Осталось понять, что с этим делать. К Delphi такие object'ы легко линкуются, а вот с FPC пока косяк... Может как-то по-другому можно подлинковать с-модули к проекту на FPC?
devels
постоялец
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

Сообщение devels »

Я точно знаю что fpc понимает объектные файлы от gcc, а делфи только от c++ builder. Obj файлы это файлы от cи билдера.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Так я с помощью gcc уже и сделал (расширение было o, а не obj). Они в принципе прилинковались, но компилятор выдал два десятка сообщений, подобных описанному выше.
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

А как они в модуле объявлены? Должно быть

Код: Выделить всё

cdecl; external;

или

Код: Выделить всё

external name 'xxx';


Или и cdecl и name...

Добавлено спустя 2 минуты 31 секунду:
Иначе

Код: Выделить всё

function deflateinit2

будет искаться по тому сложносочиненному имени, а не по 'deflateinit2'.
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

2Иван Шихалев
Спасибо! Действительно, внешние процедуры были объявлены неверно.

Теперь осталось всего 4 ошибки:

project1.lpr(20,1) Error: Undefined symbol: _malloc
project1.lpr(20,1) Error: Undefined symbol: _free
project1.lpr(20,1) Error: Undefined symbol: _longest_match
project1.lpr(20,1) Error: Undefined symbol: _match_init


Откуда у них уши растут - тоже непонятно. Эти название нигде в коде не упоминаются (в o-файлах тоже найти не могу). Может какой-то стандартный модуль нужно подключить?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Стоит попробовать подключить модуль cmem. Если не поможет, что-то типа {$LINKLIB C}...
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Иван Шихалев писал(а):Стоит попробовать подключить модуль cmem. Если не поможет, что-то типа {$LINKLIB C}...

К сожалению, это не помогло. В cmem нужных функций нет, библиотеку не смог найти (пробовал ещё подключить libc).

Две ошибки победить удалось, скомпилировав исходники zlib с другими параметрами (там в obj-файл линкуется дополнительный кусок ассемблерного кода). С двумя оставшимися (_melloc и _free) кое-что прояснилось. В оригинальном API zlib для Delphi эти функции определены отдельно:

Код: Выделить всё

function _malloc(Size: Integer): Pointer; cdecl;
begin
  Result:=AllocMem(Size);
end;

procedure _free(Block: Pointer); cdecl;
begin
  FreeMem(Block);
end;   


Но если просто скопировать эти функции в нужное место (в самое начало файла, где все вызовы zlib прописаны), то FPC всё-равно ругается:

project1.lpr(20,1) Error: Undefined symbol: _malloc
project1.lpr(20,1) Error: Undefined symbol: _free


Пробовал явно вызывать эти функции как внешние (добавлял external), но тогда компилятор ругается ещё интереснее:

ZLibExApi.pas(214,9) Error: Identifier not found "Result"
Ответить