Страница 1 из 2

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

СообщениеДобавлено: 08.12.2010 20:14:58
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.

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

СообщениеДобавлено: 09.12.2010 11:04:33
v-t-l

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

СообщениеДобавлено: 09.12.2010 13:27:55
Nik
v-t-l
Уже искал по запросу COFF. Куча советов по компиляции AMS-кода в правильные obj-файлы, и вообще ничего на тему компиляции с-кода.

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

СообщениеДобавлено: 10.12.2010 18:30:56
v-t-l
gcc для винды (mingw32+msys).
инструкции по компиляции zlib приблизительно:
запускаем msys
cd в папку с распакованными сырцами zlib
./configure
make

хотя обычно в комплекте идет файлик INSTALL с описанием, как что делать

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

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

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


Самое странное, что таких названий вообще нет в исходниках (и object'ах) zlib. Что за ерунда такая, кто-нибудь знает?

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

СообщениеДобавлено: 11.12.2010 07:11:34
Sergei I. Gorelkin
В исходниках zlib их и не может быть, это FPC код чем-то недоволен.

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

СообщениеДобавлено: 11.12.2010 11:54:58
Nik
Да я понимаю, что FPC. Только имена отсутствующих функций смущают: ZLIBEXAPI_DEFLATEINIT.

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

СообщениеДобавлено: 11.12.2010 12:52:30
Sergei I. Gorelkin
zlibexapi - это имя модуля либо класса/объекта, deflateinit2 - имя процедуры, crc (которое дальше) означает, что у процедуры настолько много параметров, что их типы, записанные последовательно, не влезут в ограничение на 127 символов.

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

СообщениеДобавлено: 11.12.2010 15:33:41
Nik
Ну, что это такое, в целом, ясно. Осталось понять, что с этим делать. К Delphi такие object'ы легко линкуются, а вот с FPC пока косяк... Может как-то по-другому можно подлинковать с-модули к проекту на FPC?

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

СообщениеДобавлено: 11.12.2010 21:30:45
devels
Я точно знаю что fpc понимает объектные файлы от gcc, а делфи только от c++ builder. Obj файлы это файлы от cи билдера.

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

СообщениеДобавлено: 12.12.2010 00:02:52
Nik
Так я с помощью gcc уже и сделал (расширение было o, а не obj). Они в принципе прилинковались, но компилятор выдал два десятка сообщений, подобных описанному выше.

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

СообщениеДобавлено: 12.12.2010 00:42:56
Иван Шихалев
А как они в модуле объявлены? Должно быть
Код: Выделить всё
cdecl; external;

или
Код: Выделить всё
external name 'xxx';


Или и cdecl и name...

Добавлено спустя 2 минуты 31 секунду:
Иначе
Код: Выделить всё
function deflateinit2

будет искаться по тому сложносочиненному имени, а не по 'deflateinit2'.

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

СообщениеДобавлено: 12.12.2010 13:38:16
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-файлах тоже найти не могу). Может какой-то стандартный модуль нужно подключить?

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

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

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

СообщениеДобавлено: 12.12.2010 21:34:37
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"