Минимальная RTL. Проблемы с DLL

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

TimK
новенький
Сообщения: 16
Зарегистрирован: 13.01.2010 05:26:49

Сообщение TimK »

Sergei I. Gorelkin писал(а):Я, честно говоря, не совсем понимаю, что там творится: ну вычли из стека чуть побольше - это неоптимально, но вроде как работать должно по-прежнему. Или же причина в том, что Win64 предъявляет определенные требования к выравниванию стека, а Win32 - нет?
Это явление удается воспроизвести с оригинальным модулем System?


Вот у меня тоже смутные сомнения, что кастрация была через-чур радикальной :) Хотя ничего касающегося стека в оригинале DLL EntryPoint я не заметил. Асемблерный код с оригинальным System у DoProcessAttach одинаковый, но не запускал. Щас проверю.

Добавлено спустя 2 минуты 54 секунды:
TimK писал(а):Асемблерный код с оригинальным System у DoProcessAttach одинаковый, но не запускал. Щас проверю.


С оригинальным все хорошо :oops:
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

Sergei I. Gorelkin 11.02.2010 20:59:38
Я, честно говоря, не совсем понимаю, что там творится: ну вычли из стека чуть побольше - это неоптимально, но вроде как работать должно по-прежнему. Или же причина в том, что Win64 предъявляет определенные требования к выравниванию стека, а Win32 - нет?

Насчет выравнивания стека незнаю, но параметры в 64 битной версии передаються немного по другому. Количество регистров увеличелось

Как радикальное средство по уменьшень dll писать часть кода на асме
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

TimK писал(а):С оригинальным все хорошо

Тогда похоже на то, что действительно рубанул сплеча и выкинул что-то вроде CheckInitialStkLen (вызывается из инициализации system). С этим нужно поаккуратнее :)
TimK
новенький
Сообщения: 16
Зарегистрирован: 13.01.2010 05:26:49

Сообщение TimK »

Sergei I. Gorelkin писал(а):Тогда похоже на то, что действительно рубанул сплеча и выкинул что-то вроде CheckInitialStkLen (вызывается из инициализации system). С этим нужно поаккуратнее :)

Добавил - не помогает :(

Код: Выделить всё

function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;assembler;
asm
  movq  %gs:(8),%rax
  subq  %gs:(16),%rax
end;

procedure FPC_LibInitializeUnits; [public, alias: 'FPC_LIBINITIALIZEUNITS'];
begin
  CheckInitialStkLen($1000000);
end;

StackTop, StackBottom, StackLength используется в менеджере памяти и обработке исключений - у меня этого нет...
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

TimK писал(а):код состоит из 10 вызовов WinAPI.

http://flatassembler.net/ :)
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Подниму старую тему, так как сегодня весь день боролся с подобным. Выяснил, что причина в неправильном описании MapViewOfFile в FPC. Последний параметр (dwNumberOfBytesToMap) должен иметь тип SIZE_T а не DWORD. В последней версии (2.4.2) ошибка до сих пор не поправлена. Пожалуйста, отрепортите.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

В trunk уже исправлено.

Добавлено спустя 1 минуту 49 секунд:
(если быть точным, то ревизия 15630 от 24 июля прошлого года)
Ответить