HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Компиляция дллок Half-Life с помощью MinGW
Надо разобраться
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6867
Возраст: 34

Рейтинг



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, в которой не будет варнингов? Или в опциях компилятора указать нужный стандарт кода?

Сообщить модератору | IP: Записан
Сообщение: 119240

Старое сообщение 30-04-2013 15:08
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35062
Нанёс повреждений: 514 ед.
Возраст: 39

Рейтинг



Награды
 
[1 награда]


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

__________________

Сообщить модератору | IP: Записан
Сообщение: 119241

Старое сообщение 30-04-2013 15:28
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33062
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
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'

Сообщить модератору | IP: Записан
Сообщение: 119244

Старое сообщение 30-04-2013 15:52
-
fire64
Житель форума

Дата регистрации: Apr 2007
Проживает: Москва
Сообщений: 2362
Возраст: 35

Рейтинг



Ku2zoff, глянь исходники ксаша под линукс, которые я портировал.
У меня там сервер скомпилен нормально и под HLDS Linux успешно грузится.

По логике тот код и под MinGW должен компилиться.

__________________
Вся сила лысого кощея,
Сокрыта в башне из костей
Воздвигнутой, под небесами
На месте похорон людей

Отредактировано fire64 30-04-2013 в 16:52

Сообщить модератору | IP: Записан
Сообщение: 119246

Старое сообщение 30-04-2013 16:42
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35062
Нанёс повреждений: 514 ед.
Возраст: 39

Рейтинг



Награды
 
[1 награда]


Цитата:
fire64 писал:
там сервер скомпилен нормально

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

__________________

Сообщить модератору | IP: Записан
Сообщение: 119247

Старое сообщение 30-04-2013 17:16
-
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6867
Возраст: 34

Рейтинг



Цитата:
Дядя Миша писал:
Ксаш крэшится от такой дллки?

Ага. В аттач приложил. Скомпилена в дебаге, довольно жирная (почти 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() /* */

для не-виндовс.

Вложение: mp.7z.001.zip (500.0 кб)
Этот файл был скачан 192 раз.

Сообщить модератору | IP: Записан
Сообщение: 119248

Старое сообщение 30-04-2013 17:21
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6867
Возраст: 34

Рейтинг



Т.к. аттач, чёрт возьми не всеядный, пришлось дописать архивам расширение zip, чтобы не подавился
Второй кусок архива:

Добавлено 01-05-2013 в 00:25:

Цитата:
fire64 писал:
Ku2zoff, глянь исходники ксаша под линукс, которые я портировал.
У меня там сервер скомпилен нормально и под HLDS Linux успешно грузится.

У меня тащем-то проблема с виндовой дллкой, а не с линуксовой сошкой. Я тут на досуге глядел макефайлы для разных исходников, ни в одном не нашёл упоминания о def-файлах. Как происходит экспорт GiveFnptrsToDll в линуксе?

Добавлено 01-05-2013 в 00:27:

Цитата:
XaeroX писал:
Там, например, совсем другой механизм декорирования имён экспортов

То есть, если я соберу сингловую дллку с другими именами экспортов, сингл будет глючить? Я так понимаю, что сейв/рестор в особенности. А есть вариант этот механизм подменить?

Вложение: mp.7z.002.zip (199.0 кб)
Этот файл был скачан 505 раз.

Сообщить модератору | IP: Записан
Сообщение: 119249

Старое сообщение 30-04-2013 17:27
- За что?
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6867
Возраст: 34

Рейтинг



Лог ксаша на всякий случай.

Вложение: engine.txt (5.4 кб)
Этот файл был скачан 471 раз.

Сообщить модератору | IP: Записан
Сообщение: 119250

Старое сообщение 30-04-2013 17:37
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33062
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
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'

Сообщить модератору | IP: Записан
Сообщение: 119251

Старое сообщение 30-04-2013 17:58
-
ONeiLL
CrazyUkrainian

Дата регистрации: Dec 2011
Проживает: Украина, Житомир
Сообщений: 562
Возраст: 27

Рейтинг



Дядя Миша всё норм открывается, просто надо убирать .zip в имени файла
http://yadi.sk/d/uExbFed84U3Fa

Сообщить модератору | IP: Записан
Сообщение: 119252

Старое сообщение 30-04-2013 18:06
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33062
Нанёс повреждений: 392 ед.

Рейтинг



Поглядел, вылетает. Думаю там что-то с фрейм-поинтером нахимичили.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | IP: Записан
Сообщение: 119255

Старое сообщение 30-04-2013 19:02
-
Ku2zoff
Мастер Ёда из Деревни Дуракоф

Дата регистрации: Apr 2007
Проживает: В Деревне дураков
Сообщений: 6867
Возраст: 34

Рейтинг



Дядя Миша и в какую сторону копать?

Сообщить модератору | IP: Записан
Сообщение: 119256

Старое сообщение 30-04-2013 19:26
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33062
Нанёс повреждений: 392 ед.

Рейтинг



Кстати вспомнил. Учти один важный момент.
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'

Сообщить модератору | IP: Записан
Сообщение: 119257

Старое сообщение 30-04-2013 19:52
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 10:26. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > Компиляция дллок Half-Life с помощью MinGW
Надо разобраться
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

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