HLFX.Ru Forum
Показать все 13 сообщений этой темы на одной странице

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 Компиляция дллок 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, остальные можно и нужно исправлять.

__________________

xaerox on Vivino


Отправлено Дядя Миша 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 писал:
там сервер скомпилен нормально

Чем? Компилятор, версия?

__________________

xaerox on Vivino


Отправлено 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)
2
{
3
  _asm
4
  {		wait
5
  fnstcw	old_cw
6
  wait
7
  mov		ax, word ptr old_cw
8
  or		ah, 0xc
9
  mov		word ptr new_cw,ax
10
  fldcw	new_cw
11
}
12
}
13
 
14
int __inline quick_ftol(float f)
15
{
16
  _asm {
17
    // Assumes that we are already in chop mode, and only need a 32-bit int
18
    fld		DWORD PTR f
19
    fistp	DWORD PTR dlong
20
  }
21
  return dlong.i[0];
22
}
23
 
24
void __inline restore_fpu_cw(void)
25
{
26
  _asm	fldcw	old_cw
27
}
код на ассемблере (юзается при компиляции под виндой), на который ругается компилятор. Собственно толком ничего не нашёл по этому поводу для 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'


Временная зона GMT. Текущее время 07:16.
Показать все 13 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024