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

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

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

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

Сообщение Nik » 08.12.2010 20:14:58

Решил на досуге приспособить для 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.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение v-t-l » 09.12.2010 11:04:33

v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Nik » 09.12.2010 13:27:55

v-t-l
Уже искал по запросу COFF. Куча советов по компиляции AMS-кода в правильные obj-файлы, и вообще ничего на тему компиляции с-кода.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение v-t-l » 10.12.2010 18:30:56

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

хотя обычно в комплекте идет файлик INSTALL с описанием, как что делать
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Сообщение Nik » 10.12.2010 20:16:45

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

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


Самое странное, что таких названий вообще нет в исходниках (и object'ах) zlib. Что за ерунда такая, кто-нибудь знает?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение Sergei I. Gorelkin » 11.12.2010 07:11:34

В исходниках zlib их и не может быть, это FPC код чем-то недоволен.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение Nik » 11.12.2010 11:54:58

Да я понимаю, что FPC. Только имена отсутствующих функций смущают: ZLIBEXAPI_DEFLATEINIT.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение Sergei I. Gorelkin » 11.12.2010 12:52:30

zlibexapi - это имя модуля либо класса/объекта, deflateinit2 - имя процедуры, crc (которое дальше) означает, что у процедуры настолько много параметров, что их типы, записанные последовательно, не влезут в ограничение на 127 символов.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

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

Сообщение Nik » 11.12.2010 15:33:41

Ну, что это такое, в целом, ясно. Осталось понять, что с этим делать. К Delphi такие object'ы легко линкуются, а вот с FPC пока косяк... Может как-то по-другому можно подлинковать с-модули к проекту на FPC?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение devels » 11.12.2010 21:30:45

Я точно знаю что fpc понимает объектные файлы от gcc, а делфи только от c++ builder. Obj файлы это файлы от cи билдера.
devels
постоялец
 
Сообщения: 137
Зарегистрирован: 01.09.2010 12:14:38

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

Сообщение Nik » 12.12.2010 00:02:52

Так я с помощью gcc уже и сделал (расширение было o, а не obj). Они в принципе прилинковались, но компилятор выдал два десятка сообщений, подобных описанному выше.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение Иван Шихалев » 12.12.2010 00:42:56

А как они в модуле объявлены? Должно быть
Код: Выделить всё
cdecl; external;

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


Или и cdecl и name...

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

будет искаться по тому сложносочиненному имени, а не по 'deflateinit2'.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

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

Сообщение Nik » 12.12.2010 13:38:16

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-файлах тоже найти не могу). Может какой-то стандартный модуль нужно подключить?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

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

Сообщение Иван Шихалев » 12.12.2010 17:26:48

Стоит попробовать подключить модуль cmem. Если не поможет, что-то типа {$LINKLIB C}...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

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

Сообщение Nik » 12.12.2010 21:34:37

Иван Шихалев писал(а):Стоит попробовать подключить модуль 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"
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7

Рейтинг@Mail.ru