#c #borland
Я использую Open Watcom копилятор для сборки DOS 16 приложения под 80188 подобную архитектуру. Проблема заключается в том, что я не могу подключить библиотеку собранную в BC 3.1. После, казалось бы, успешной линковки, при использовании некоторых функций из этой библиотеки, я получаю сообщения от линковщика, что не найден символ _malloc() или _free(). Использование функции malloc() в пользовательском коде проходит линковку. Как я понял проблема возникает только, когда какя либо функция библиотеки вызывает malloc() или free(), то есть библиотека нифига не стэндалон и тянет зависимости из стандартной бибилотеки собранной для BC 3.1. Проверить это я никак не могу и пересобрать библиотеку тоже, так как ее исходников нет. Всвязи с этим у меня вопрос: как портировать билиотеку на Open Watcom ? malloc() и free() есть в библиотеках Open Watcom но их символы скомпилированы видимо не так как того ожидает борландовская библиотека.
Ответы
Ответ 1
Ну да, похоже что библиотека BC из себя обращается к malloc() и free(), ожидая при этом имена в формате с подчёркиванием в начале. А в библиотеках Watcom эти функции могут быть без подчёркивания, или вообще с подчёркиванием в конце... Проверить это можно просто посмотрев дамп имён ваткомовской библиотеки (clib кажись). wlib из их стандартной поставки должен это уметь, а может и wlink... Если там не обнаружится имён _malloc и _free, то самый простой выход - сделать свои обёртки: void * _malloc( size_t sz ) { return malloc(sz); }; void _free( void * mem ) { free(mem); }; И линковать их с проектом. UPD: Таки проверил. Действительно, Open Watcom 1.8.0, clib3r.lib (register calling): free_ .... nfree.c malloc_ .... nmalloc.c И для clib3s.lib (stack calling, чего борланд и ожидает): free .... nfree.c malloc .... nmalloc.c Так что - обёртка.
Комментариев нет:
Отправить комментарий