Страницы

Поиск по вопросам

воскресенье, 12 января 2020 г.

Портирование библиотеки

#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 Так что - обёртка.

Комментариев нет:

Отправить комментарий