Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Чт дек 14, 2017 7:19 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 49 сообщений ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Пт май 31, 2013 12:38 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 443
У меня есть загрузчик PE программ. Пока с библиотеками PE не очень работает(глюки и с таблицей релокаций вообще не работает, но это будет). Но для проб писал прогу в PE формате использующую функции Колибри и она корректно работала. Ну в общем если кому-то надо поскорей, то приведу в порядок исходники и выложу. Если не срочно, то сначала добью всё-таки эти библиотеки:)

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Пт май 31, 2013 1:16 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
Не-а, идея в том, чтобы писать в родном для "Колибри" формате и собирать штатным компилятором (FASM), полностью контролируя весь процесс. Это особенно актуально для библиотек, поскольку, как мне кажется, именно разработка библиотек на Delphi будет актуальна для "Колибри".

Сборка FASM-ом позволит писать на ЯВУ только самое необходимое, что очень сложно реализовать в обозримые сроки на ассемблере. Системные функции и всякие хаки можно написать сразу на FASM, причем только те, что реально нужны, не заморачиваясь полным System. И писать их можно будет по мере надобности, а не все сразу.

Я уже попробовал собрать FastMM для "Колибри" при помощи "Пифии". Кто тут про прикладной диспетчер кучи заикался? Для больших и сложных программ вроде браузера диспетчер вроде FastMM -- самое то.

Пока, правда, собрать FastMM не получилось. Оказалось, что FASM чувствителен к порядку аргументов CMPXCHG. К тому же, похоже, у меня поломался разборщик map-файлов. :(

_________________
Разработчик языка программирования Кантор


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Пт май 31, 2013 2:07 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 443
Эээ... диспетчер кучи - это чтобы любые блоки памяти выделять, а не по странице? Тогда выкладываю только часть загрузчика PE прог :D Там инклудник и если не вкомпилится, то не пинайте, просто скажите чего не так :roll: Описания все внутри. Ну и ReAllocMem нет. Пока не нужен был просто.


Вложения:
MemoryManager.inc [5.58 КБ]
93 скачивания

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Пт май 31, 2013 3:50 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
GerdtR писал(а):
Тогда выкладываю только часть загрузчика PE прог :D

Ты, конечно, извини меня за прямоту, но неужели ты думаешь, что напишешь на коленке лучше FastMM, который работает в тысячах программ?

А мне как-то внезапно пришло осознание, что формат OMF в Delphi 4 поменялся не просто так, а именно из-за появления перегружаемых функций. Связал оба события...

_________________
Разработчик языка программирования Кантор


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Пт май 31, 2013 11:14 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 443
Freeman писал(а):
Кто тут про прикладной диспетчер кучи заикался?

Хм, ну Вы сами напросились, вот и скинул)
Freeman писал(а):
Ты, конечно, извини меня за прямоту, но неужели ты думаешь, что напишешь на коленке лучше FastMM, который работает в тысячах программ?

Конечно я так не считаю. Но работает же :mrgreen:

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Вс июн 02, 2013 9:52 pm 
Не в сети
KSoC/GSoC Student

Зарегистрирован: Ср июл 11, 2012 3:17 am
Сообщения: 224
В чем проблема, делфи и так не плохо компилит под Колибри, получаются рабочие исполняемые файлы. При чем не только 3 версия, но запускал и 7ю. Менаджер памяти, тоже есть под него, переписывай не хочу.))) Выкладывал на сайте в темах файлик, который переделывает под исполняемый файл колибри.
Изображение
Исходник:
Спойлер: Показать
Код:
unit ww;
interface

type system_colors = record
  frame: integer;
  grab: integer;
  grab_button: integer;
  grab_button_text: integer;
  grab_text: integer;
  work: integer;
  work_button: integer;
  work_button_text: integer;
  work_text: integer;
  work_graph: integer;
end;

const
  wnd_x = 200;
  wnd_y = 200;
  wnd_w = 317;
  wnd_h = 116;
 
procedure main;
Procedure Wnd_DrawBegin;  Assembler;
Procedure Wnd_DrawEnd;    Assembler;
Procedure Wnd_SetWindows; Assembler;

var
  sc: system_colors;
  psc: pointer;
  key: cardinal;
  wnd_c: pchar;

implementation

procedure main;
label xstart,xdraw,xstill,xkey,xbutton,xexit;
begin
  psc := @sc;
  wnd_c := 'Hello World!';
asm

xstart:
    call    xdraw

xstill:
    mov     eax,10                        // функция 10 - ждать события
    int     $40                           // Прерывание
    cmp     eax,1                         // перерисовать окно ?
    je      xstart                        // если да - на метку xstart
    cmp     eax,2                         // нажата клавиша ?
    je      xkey                          // если да - на key
    cmp     eax,3                         // нажата кнопка ?
    je      xbutton                       // если да - на button
    jmp     xstill                        // если другое событие - в начало цикла

xkey:
    mov     eax,10                        // функция 2 - считать код символа (в ah) (тут в принципе не нужна)
    int     $40                           // Прерывание
    jmp     xstill                        // вернуться к началу цикла

xbutton:
    mov     eax,17                        // функция 17 - получить идентификатор нажатой кнопки
    int     $40                           // Прерывание
    cmp     ah, 1                         // если нажата кнопка с номером 1,
    jz      xexit                         // выходим
    jmp     xstill                        // вернуться к началу цикла
  xexit:
    mov     eax,-1                        // функция -1 - выход
    int     $40                           // Прерывание

  xdraw:
    call    Wnd_DrawBegin
    call    Wnd_SetWindows


    mov     eax,48                        // Функция 48 - стили отображения окон.
    mov     ebx,4                         // Подфункция 4 - возвращает eax = высота скина.
    int     $40                           // Прерывание
    mov     ecx,eax                       // Запоминаем высоту скина

    xor     eax,eax                       // Очищаем eax (mov eax,0) (Функция 0)
    mov     ebx,wnd_x shl 16+wnd_w        // [координата по оси x]*65536 + [размер по оси x]
    add     ecx,wnd_y shl 16+wnd_h        // Высота скина + [координата по y]*65536 + [размер по y]
    mov     edx,[sc.work]
    or      edx,$34000000                 // Или окно со скином фиксированных размеров
    mov     edi,wnd_c                     // Заголовок окна
    int     $40                           // Прерывание


    call    Wnd_DrawEnd   
    ret
end;

end;

Procedure Wnd_DrawBegin(); Assembler;
Asm
 mov    eax,12
 mov    ebx,1
 int    $40
End;

Procedure Wnd_DrawEnd(); Assembler;
Asm
 mov    eax,12
 mov    ebx,2
 int    $40
End;

Procedure Wnd_SetWindows; Assembler;
Asm
    mov     eax,48                        // Функция 48 - стили отображения окон
    mov     ebx,3                         // Подфункция 3 - получить стандартные цвета окон.
    mov     ecx,psc                        // Указатель на буфер размером edx байт, под структуру
    mov     edx,40                        // Размер таблицы цветов (должен быть 40 байт)
    int     $40                           // Прерывание
end;

begin
  main();
end.

выходной файл: 856 байт, при оптимизации 630 байт, после kpack без оптимизации - 441 байт, с оптимизацией 321 байт.
http://akyltist.ucoz.org/asm/ww.kos

PS: Delphi 3. Для 7ки собирал точно такой же, но там геморойней)


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Вс июн 02, 2013 10:22 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
Akyltist писал(а):
Выкладывал на сайте в темах файлик, который переделывает под исполняемый файл колибри.

А библиотеку?

_________________
Разработчик языка программирования Кантор


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Вс июн 02, 2013 11:32 pm 
Не в сети
KSoC/GSoC Student

Зарегистрирован: Ср июл 11, 2012 3:17 am
Сообщения: 224
Freeman писал(а):
Поскольку Дельфи не может компилировать в формат Колибри, придётся сделать поддержку PE.

Доказал что может, зачем библиотека?).

PS: работаю над своим компилятором паскаля)


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Ср сен 21, 2016 3:25 am 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
В этот раз не 5 лет прошло, а всего 2...

Глядя на товарища ALEXS1983, решил выложить свою альфу. В части поддержки KolibriOS это даже не альфа, а скорее концепт, поскольку генерируемые файлы неработоспособны в KolibriOS. Нужно дорабатывать и отлаживать, но времени нет. Пример ww.pas я взял из сообщения выше, только переделал в программу, поскольку для PE Tool нужен exe- или dll-файл, а не .dcu.

PE Tool — это единая утилита для пересборки PE-файлов, основанная на самописном модуле ExeImages, выполняющем все манипуляции. От других утилит (pe2kos, exe2kos, pe2kex) PE Tool отличается полноценным разбором PE-файла и богатым набором ключей, где планируемый экспорт в MENUETxx — только один из режимов. Остальные функции уже работают, программа давно лежит на SourceForge, иногда ее скачивают. Если поддержку KolibriOS удастся довести до ума, получится по-настоящему гибкая технологическая утилита, не зависящая от имен секций, предопределенных адресов, версий компиляторов и пр. Скажем, выбор между MENUET01 и MENUET02 в ней делается автоматически, на основе присутствия сегмента TLS в PE-файле, а присутствие TLS определяется не по имени .tls, а из соответствующего поля в каталоге данных PE.

С момента выкладывания 3 года назад формат KOLIBRI был выпилен, зато реализовано перебазирование (метод ExeImages.TImage.Rebase), которое и нужно доработать. Об особенностях форматов MENUETxx я объяснял на видео. Поскольку MENUETxx -- плоский бинарник с заголовком, без заголовка это будет плоский бинарник (да, кэп!), то есть на Delphi формально можно будет написать ядро ОС. "Тулчейн" для Delphi будет включать в себя dcc32 и pet.

Примеры вызова PE Tool:
Код:
// преобразование в MENUETxx
pet -strip -trunc -menuet -dropsect .idata,.rsrc ww.exe -into ww.kex

// получение списка секций PE-файла
pet -ls ww.exe

От официально вышедшей PE Tool 0.5 выкладываемая альфа отличается присутствием ключа -menuet. Можете скачать, собрать, поотлаживать...
Вложение:
PETool-0.6-alpha.7z [121.6 КБ]
27 скачиваний

В теории экспорт не привязан к Delphi, преобразовывать в MENUETxx можно будет PE-файлы других компиляторов. На практике для C/C++ это неактуально, поскольку у них есть свой ld. На Delphi же никто не пишет, поэтому спроса нет, и разработка идет вяло. Ну, и время, уже говорил.

_________________
Разработчик языка программирования Кантор


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Ср окт 05, 2016 4:57 pm 
Не в сети

Зарегистрирован: Вт окт 04, 2016 10:05 pm
Сообщения: 44
Freeman писал(а):
"Тулчейн" для Delphi будет включать в себя dcc32 и pet.

Примеры вызова PE Tool:
Код:
// преобразование в MENUETxx
pet -strip -trunc -menuet -dropsect .idata,.rsrc ww.exe -into ww.kex

// получение списка секций PE-файла
pet -ls ww.exe

В теории экспорт не привязан к Delphi, преобразовывать в MENUETxx можно будет PE-файлы других компиляторов. На практике для C/C++ это неактуально, поскольку у них есть свой ld. На Delphi же никто не пишет, поэтому спроса нет, и разработка идет вяло. Ну, и время, уже говорил.


Этот инструмент вырезает ненужные секции? Про ld - я делал так:

Код:
dcc32.exe system.pas sysinit.pas strings.pas -JP -M -Y -Z -$D- -0 > sysbuild.log

omf2d system.obj system2.obj /U- /U_* /CP@initialization$qqrv=@system_initialization /CP@Finalization$qqrv=@system_finalization
omf2d sysinit.obj sysinit2.obj /U- /U_* /CP@initialization$qqrv=@sysinit_initialization /CP@Finalization$qqrv=@sysinit_finalization
omf2d strings.obj strings2.obj /U- /U_* /CP@initialization$qqrv=@strings_initialization /CP@Finalization$qqrv=@strings_finalization

del system.obj
del sysinit.obj
del strings.obj

ren system2.obj system.obj
ren sysinit2.obj sysinit.obj
ren strings2.obj strings.obj


Код:
link.exe /ALIGN:16 /FILEALIGN:16 /FORCE:UNRESOLVED /SUBSYSTEM:WINDOWS /SECTION:.text,ERW /MERGE:.rdata=.text /MERGE:_INIT_=.text /MERGE:_EXIT_=.text /ENTRY:Start$qqsuiuiui Hello.obj system.obj kernel32.lib user32.lib /out:Hello.exe


Оно так же совместит секции. omf2d - преобразует объектные файлы из борландовского в coff формат(а, не, вру: из нового бороандовского в старый, еще есть objconv, который может в COFF преобразовать + PEDUMP, который показывает все, что есть в PE), который понимается MSовским линкером. После этого PEшник чистый, конвертировать его можно легко куда угодно.


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Ср окт 05, 2016 6:52 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
//DG писал(а):
Этот инструмент вырезает ненужные секции?

Модуль ExeImages, вокруг которого строится PE Tool, писался как набор классов (библиотека, движок) для написания патчей. В планах была также работа с ресурсами и вывод содержимого PE-файла по аналогии с утилитами tdump или objdump. Ничего из этого пока не реализовано, работает лишь функциональность в PE Tool, поскольку пока это единственная программа, использующая ExeImages.

Для MENUETxx возможный алгоритм выглядит так:
  • PE-файл грузится и разбирается обычным порядком.
  • Обрабатываются ключи, не влияющие на перебазирование.
  • Вырезаются секции, задаваемые ключом -dropsect.
  • В зависимости от наличия секции TLS определяется формат -- MENUET01 или MENUET02.
  • Выполняется перебазирование файла на смещение заголовка MENUETxx (MENUET02 на 4 байта длиннее). Во время перебазирования секции укладываются друг за другом с минимальным выравниванием, чтобы получающийся файл был как можно меньше.
  • Обрабатывается ключ -strip, вырезающий секцию перемещаемых символов из образа.
  • Полученный образ сохраняется в файл.
На практике получается не так однозначно, поскольку секция перемещаемых символов нужна для перебазирования, но при укладывании она уже не должна учитываться, поскольку формат MENUETxx не имеет механизма перемещаемых символов. Для текущей реализации ExeImages.TImage.Rebase это оказалось нетривиально, из-за чего я приостановил разработку.

//DG писал(а):
omf2d - преобразует объектные файлы из борландовского в coff формат(а, не, вру: из нового бороандовского в старый, еще есть objconv, который может в COFF преобразовать + PEDUMP, который показывает все, что есть в PE), который понимается MSовским линкером.

Я не уверен, что сторонние компоновщики смогут правильно связать программы с перегруженными процедурами на Delphi. Borland поменяла формат OMF именно ради перегруженных (overload) процедур Delphi 4. Можно, конечно, писать на Delphi 3 в стиле Turbo Pascal 3.0 -- без модулей, чисто на {$include} но это неполноценная поддержка Delphi, не обеспечивающая ожидаемой гибкости.

Если писать конвертер не на коленке, а по-честному, PE-файл может быть любым, не обязательно "чистым". Тут, собственно, сталкиваются две культуры: компиляция и компоновка разными утилитами (Microsoft, GNU) или одной утилитой (Delphi, FASM). Мне кажется, что культуре "Колибри" соответствует FASM, а не GNU.

_________________
Разработчик языка программирования Кантор


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Ср окт 05, 2016 6:57 pm 
Не в сети

Зарегистрирован: Вт окт 04, 2016 10:05 pm
Сообщения: 44
omf2d работает отлично с D7.

"Если писать конвертер не на коленке, а по-честному, PE-файл может быть любым, не обязательно "чистым"."
А я и не говорю, что нужно расчитывать на чистый. Я просто подумал, что делать ту работу, которую замечательно делает линкер - дублирование.
Так, на всякий случай, я делал конвертре с релокацией под один свой формат.


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Ср окт 05, 2016 6:59 pm 
Не в сети

Зарегистрирован: Вт окт 04, 2016 10:05 pm
Сообщения: 44
" и вывод содержимого PE-файла"
Это есть в утилите PEDUMP от 1995(!) года.


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Ср окт 05, 2016 9:12 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Вт май 08, 2007 12:44 am
Сообщения: 340
//DG писал(а):
omf2d работает отлично с D7.

Пока не увижу примера с перегруженными функциями, не поверю.
//DG писал(а):
" и вывод содержимого PE-файла"
Это есть в утилите PEDUMP от 1995(!) года.

Для уверенности в работоспособности библиотеки по-любому нужен объемлющий тест. PE Tool таковым и является. Писать тест ради теста скучно, оформил в виде утилиты.

_________________
Разработчик языка программирования Кантор


Вернуться к началу
 Заголовок сообщения: Re: Delphi SDK для Колибри
СообщениеДобавлено: Ср окт 05, 2016 9:20 pm 
Не в сети

Зарегистрирован: Вт окт 04, 2016 10:05 pm
Сообщения: 44
Freeman писал(а):
//DG писал(а):
omf2d работает отлично с D7.

Пока не увижу примера с перегруженными функциями, не поверю.
//DG писал(а):
" и вывод содержимого PE-файла"
Это есть в утилите PEDUMP от 1995(!) года.

Для уверенности в работоспособности библиотеки по-любому нужен объемлющий тест. PE Tool таковым и является. Писать тест ради теста скучно, оформил в виде утилиты.


Такое устроит? Или надо через несколько модулей?
Код:
function Func1(AParam: integer): boolean; overload;
begin
  MessageBox(0,'Header','TinyPE in Delphi',0);
end;

function Func1(AParam: boolean): boolean; overload;
begin
  MessageBox(0,'Header','TinyPE in Delphi',0);
end;

function Start(hModule, hReason, hReserved: DWORD): LongBool;
begin
  Func1(3);
  Func1(True);
  Result:= TRUE;
end;


В разных модулях надо mangle дописывать(например, FuncName$qqruc), но преобразование работает. Но не суть - без перегруженных можно обойтись.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 49 сообщений ]  На страницу Пред. 1 2 3 4 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB