HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Компиляция дллок Half-Life с помощью MinGW (https://hlfx.ru/forum/showthread.php?threadid=3892)
Отправлено Ku2zoff 30-04-2013 в 15:08:
Компиляция дллок Half-Life с помощью MinGW
В общем, после нескольких умо- и телодвижений (пальцами разумеется), успешно скомпилил серверную дллку последним релизом MinGW (за декабрь 2012, вроде бы 4.7). Исправил вызовы тчинков (аналогично адаптации под 2005 и более старшие студии), заигнорил надоедливые варнинги, статически прилинковал libgcc и libstdc++, чтобы не таскать их вместе с дллкой, сделал с горем пополам экспорт GiveFnptrsToDll.
Дллка собирается и без проблем просматривается Dependency Walker'ом. Что странно: при сборке студией экспорт GiveFnptrsToDll находится первым в списке, а при сборке MinGW - пятым, перед ним засовываются CreateInterface, DelayedUse, GetEntityAPI, GetEntityAPI2. Названия функций тчинков имеют другой формат:
студия:
C++ Source Code:
?SwingAgain@CCrowbar@@QAEXXZ |
MinGW:C++ Source Code:
_ZN8CCrowbar10SwingAgainEv |
и количество их отличается, некоторые есть только в MinGW версии, а некоторые только в MSVC. Критично ли это? Спрашиваю потому, что халфа давится дллкой на начальном этапе загрузки и крэшится, ксаш тоже.
Ещё одно: т.к. было лень разбираться (да я толком и не знаю, как их исправить) с ассемблерными вставками в common/mathlib.h, я закомментилC++ Source Code:
void __inline set_fpu_cw(void) |
int __inline quick_ftol(float f) |
void __inline restore_fpu_cw(void) |
и заюзал таковые для не-windows платформы:C++ Source Code:
#define set_fpu_cw() /* */ |
#define quick_ftol(f) ftol(f) |
#define restore_fpu_cw() /* */ |
Кто-нибудь подскажет, что я изломал?
А может версия компилятора не подходит, и нужна древняя 2.95, в которой не будет варнингов? Или в опциях компилятора указать нужный стандарт кода?
Отправлено XaeroX 30-04-2013 в 15:28:
Цитата:
Ku2zoff писал:
при сборке студией экспорт GiveFnptrsToDll находится первым в списке, а при сборке MinGW - пятым
Очевидно же, что твой MinGW игнорирует hl.def
Этот файл не просто так в папке лежит.
Цитата:
Ku2zoff писал:
Спрашиваю потому, что халфа давится дллкой на начальном этапе загрузки и крэшится
А кто тебе сказал, что халфа прожуёт дллку, скомпиленную MinGW? Там, например, совсем другой механизм декорирования имён экспортов (да ты это и сам заметил).
Добавлено 30-04-2013 в 22:26:
Цитата:
Ku2zoff писал:
А может версия компилятора не подходит, и нужна древняя 2.95
Для линуксового выделенного сервера - да, именно древняя, так как там древний глибц, а с новым будет бинарная несовместимость. Винду, славабогу, писали не упоротые линуксоиды, поэтому под виндой такого говнища как "бинарная несовместимость" нет.
Добавлено 30-04-2013 в 22:27:
Цитата:
Ku2zoff писал:
Критично ли это?
Для сингла - да, для мультиплеера - нет.
Добавлено 30-04-2013 в 22:28:
Цитата:
Ku2zoff писал:
заигнорил надоедливые варнинги
Там только один надоедливый варнинг, про invalid-offsetof, остальные можно и нужно исправлять. 
__________________
Отправлено Дядя Миша 30-04-2013 в 15:52:
Цитата:
Ku2zoff писал:
void __inline set_fpu_cw(void)
int __inline quick_ftol(float f)
void __inline restore_fpu_cw(void)
Они пустые тащем-то. Зачем ты закоментил пустые функции? 
Добавлено 30-04-2013 в 19:52:
Цитата:
Ku2zoff писал:
халфа давится дллкой на начальном этапе загрузки и крэшится, ксаш тоже.
Ксаш крэшится от такой дллки? А ну довай её суда. Он должен с ошибкой останавливаться.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено fire64 30-04-2013 в 16:42:
Ku2zoff, глянь исходники ксаша под линукс, которые я портировал.
У меня там сервер скомпилен нормально и под HLDS Linux успешно грузится.
По логике тот код и под MinGW должен компилиться.
__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей
Отправлено XaeroX 30-04-2013 в 17:16:
Цитата:
fire64 писал:
там сервер скомпилен нормально
Чем? Компилятор, версия?__________________
Отправлено Ku2zoff 30-04-2013 в 17:21:
Цитата:
Дядя Миша писал:
Ксаш крэшится от такой дллки?
Ага. В аттач приложил. Скомпилена в дебаге, довольно жирная (почти 4 мб).
Цитата:
XaeroX писал:
Там только один надоедливый варнинг, про invalid-offsetof, остальные можно и нужно исправлять.
Вот спасибо, теперь хоть знаю, какие нужно исправлять.
Цитата:
XaeroX писал:
Очевидно же, что твой MinGW игнорирует hl.def
Я добавил линкеру ключ --def mp.def, правда он ругался на синтаксическую ошибку в файле, поэтому пришлось оставить в нём (файле) только EXPORTS, а SECTIONS удалить, похоже MinGW это дело не понимает. И сдаётся мне, что ему вообще пофигу на этот def файл, экспортит сам как хочет.
Цитата:
Дядя Миша писал:
Они пустые тащем-то. Зачем ты закоментил пустые функции?
Та не-не-не. Там вот как:
C++ Source Code:
1 | void __inline set_fpu_cw(void) |
7 | mov ax, word ptr old_cw |
14 | int __inline quick_ftol(float f) |
17 | // Assumes that we are already in chop mode, and only need a 32-bit int |
24 | void __inline restore_fpu_cw(void) |
код на ассемблере (юзается при компиляции под виндой), на который ругается компилятор. Собственно толком ничего не нашёл по этому поводу для MinGW, поэтому поступил по-простому: заменил эти функции пустыми:
C++ Source Code:
#define set_fpu_cw() /* */ |
#define quick_ftol(f) ftol(f) |
#define restore_fpu_cw() /* */ |
для не-виндовс.
Отправлено Ku2zoff 30-04-2013 в 17:27:
Т.к. аттач, чёрт возьми не всеядный, пришлось дописать архивам расширение zip, чтобы не подавился
Второй кусок архива:
Добавлено 01-05-2013 в 00:25:
Цитата:
fire64 писал:
Ku2zoff, глянь исходники ксаша под линукс, которые я портировал.
У меня там сервер скомпилен нормально и под HLDS Linux успешно грузится.
У меня тащем-то проблема с виндовой дллкой, а не с линуксовой сошкой. Я тут на досуге глядел макефайлы для разных исходников, ни в одном не нашёл упоминания о def-файлах. Как происходит экспорт GiveFnptrsToDll в линуксе?
Добавлено 01-05-2013 в 00:27:
Цитата:
XaeroX писал:
Там, например, совсем другой механизм декорирования имён экспортов
То есть, если я соберу сингловую дллку с другими именами экспортов, сингл будет глючить? Я так понимаю, что сейв/рестор в особенности. А есть вариант этот механизм подменить?
Отправлено Ku2zoff 30-04-2013 в 17:37:
Лог ксаша на всякий случай.
Отправлено Дядя Миша 30-04-2013 в 17:58:
Цитата:
Ku2zoff писал:
Та не-не-не. Там вот как:
Ну что ты мне лечишь? Открываем первокваку sys_win.c и смотрим.
пустые? пустые. Ну и всё. Ты же под винду комплишь?
Цитата:
Ku2zoff писал:
А есть вариант этот механизм подменить?
Ну в новых версиях ксаш-мода наружные экспорты не юзаются. Следовательно там всё будет работать.
Добавлено 30-04-2013 в 21:58:
ЗЫ. не открываются твои архивы. Залей одним файлом на ргхост.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено ONeiLL 30-04-2013 в 18:06:
Дядя Миша всё норм открывается, просто надо убирать .zip в имени файла
http://yadi.sk/d/uExbFed84U3Fa
Отправлено Дядя Миша 30-04-2013 в 19:02:
Поглядел, вылетает. Думаю там что-то с фрейм-поинтером нахимичили.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Ku2zoff 30-04-2013 в 19:26:
Дядя Миша и в какую сторону копать?
Отправлено Дядя Миша 30-04-2013 в 19:52:
Кстати вспомнил. Учти один важный момент.
GiveFnptrsToDll объявлен как __stdcall
ни в коем случае не переопределяй его как __cdecl
вот как раз и будет такой вылет.
Добавлено 30-04-2013 в 23:52:
http://www.rsdn.ru/forum/cpp/159935.1
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'