1

Тема: Библиотеки в KolibriOS

Что на данный момент с библиотеками? Уже который год ходят разговоры о полном переходе на StrippedPE, есть даже какая-то Core.dll в этом формате... В консольных примерах из параллельной темы вижу всё тот же .obj, что и раньше. На практике пока ничего не изменилось? Похоже, FastMM придется собирать каким-то хитрым образом, чтобы получить именно библиотеку.

2 (изменено: Freeman, 22.05.2020 в 22:58)

Re: Библиотеки в KolibriOS

Freeman пишет:

Что на данный момент с библиотеками? Уже который год ходят разговоры о полном переходе на StrippedPE, есть даже какая-то Core.dll в этом формате... В консольных примерах из параллельной темы вижу всё тот же .obj, что и раньше. На практике пока ничего не изменилось?

Библиотеки пока MSCOFF.
Что касается Core.dll, "импортируемой" драйверами, то это означает, что драйверу необходимые функции предоставляет само ядро.
Вот тут список экспортируемых функций websvn.kolibrios.org/filedetails.php?re … p;rev=7168

Freeman пишет:

Похоже, FastMM придется собирать каким-то хитрым образом, чтобы получить именно библиотеку.

Библиотеку, думаю, сделать можно. Ну вот, скажем, в качестве примера библиотеки MSCOFF для KolibriOS на С websvn.kolibrios.org/filedetails.php?re … p;rev=7894 просто нужен массив EXPORTS.
А просто так подключать не пробовал? Да, это увеличит, конечно, размер программы. Но всё же для теста, на период разработки хотя бы.
Если осталось сделать только библиотеку, а сам код готов — то это не должно быть сложно.

Добавлено 22.05.2020 в 22:44

Да, EXPORTS — в Delphi зарезервированное слово.
Но, к счастью, поддерживается не только "EXPORTS", но и "_EXPORTS".
Вот здесь в ядре происходит проверка этого символа websvn.kolibrios.org/filedetails.php?re … #line-1165
А вот тут определены эти строки websvn.kolibrios.org/filedetails.php?re … 1#line-155

Ну в общем вот

пример библиотеки на Delphi 7 для KolibriOS в формате MSCOFF, содержащей 3 функции: Sum, Mul и Sub
unit Test;

interface

function Sum(A, B: LongWord) : LongWord; stdcall; forward;
function Mul(A, B: LongWord) : LongWord; stdcall; forward;
function Sub(A, B: LongWord) : LongWord; stdcall; forward;

const
  _EXPORTS: array[0..3] of record
                             ProcName: PChar;
                             ProcAddr: Pointer;
                           end = (
        (ProcName:'Sum'; ProcAddr:@Sum),
        (ProcName:'Mul'; ProcAddr:@Mul),
        (ProcName:'Sub'; ProcAddr:@Sub),
        (ProcName:Nil; ProcAddr:Nil)); // last two must be Nil

implementation

function Sum(A, B: LongWord) : LongWord; stdcall;
begin
  Result := A + B
end;

function Mul(A, B: LongWord) : LongWord; stdcall;
begin
  Result := A * B
end;

function Sub(A, B: LongWord) : LongWord; stdcall;
begin
  Result := A - B
end;

end.

собирается это так

dcc32 -j Test.pas
omf2d Test.obj
link -edit Test.obj

теперь при открытии этого файла в KolibriOS с помощью приложения cObj

мы можем наблюдать названия наших функций, содержащихся в библиотеке

misc.php?action=pun_attachment&item=21&download=0

прилагаю ниже архив с этим примером

Добавлено 22.05.2020 в 23:18

Я тут внезапно понял, что с помощью Delphi можно создавать библиотеки MSCOFF из нескольких объектных файлов.
Как считалось ранее, например, вот здесь board.kolibrios.org/viewtopic.php?f=33& … 853#p66825

Siemargl пишет:

Недостаток COFF библиотек - невозможно собрать из нескольких объектных файлов одну библиотеку

Но я сделал вот как:
добавил это

{$link unpacker.obj}
........................................
function unpack: longword; external;
........................................
        (ProcName:'unpack'; ProcAddr:@unpack),

и в результате в библиотеке у нас уже 4 функции
уж не знаю, будет ли им там интересно это, но по крайней мере, теперь известен способ собирать библиотеки из нескольких файлов

Post's attachments

Иконка вложений KolibriOS_Library.7z 564 b, 136 скачиваний с 2020-05-22 

obj_in_obj.PNG, 4.06 Кб, 339 x 331
obj_in_obj.PNG 4.06 Кб, 78 скачиваний с 2020-05-22 

Иконка вложений test.PNG 35.66 Кб, 74 скачиваний с 2020-05-22 

3

Re: Библиотеки в KolibriOS

0CodErr пишет:

А просто так подключать не пробовал? Да, это увеличит, конечно, размер программы. Но всё же для теста, на период разработки хотя бы.

На период разработки сойдет. Увеличит файл программы на 16 КБ.

4

Re: Библиотеки в KolibriOS

Freeman пишет:

На период разработки сойдет.

А вообще как планируется сделать? Отдельную библиотеку?
Или в 2-ух вариантах?

5

Re: Библиотеки в KolibriOS

Я подумал, что нужно сделать обертки для всех стандартных библиотек KolibriOS, входящих в дистрибутив. Сделать их именно как обертки, — с сохранением имен функций, констант и прочего. Один модуль Delphi — одна обертка. Обертки будут использоваться высокоуровневыми модулями, повторяющими модули FreePascal/Delphi с привычными названиями, как было сделано для модуля CRT.

Есть два исключения: по всей видимости, обертки библиотек Console и iconv придется интегрировать в модуль System, поскольку они используются уже в нем.

В связи с этим хочу переработать код System и CRT.

6 (изменено: 0CodErr, 24.09.2020 в 22:16)

Re: Библиотеки в KolibriOS

Freeman пишет:

Я подумал, что нужно сделать обертки для всех стандартных библиотек KolibriOS, входящих в дистрибутив.

Это, конечно, полезно.
Но для этого нужно в некоторой степени знать устройство этих библиотек и разбираться в самих библиотечных функциях.
Документации не так много, не говоря уже о заголовочных файлах.
Что-то есть на wiki, что-то в темах на форуме, а что-то только в исходниках той или иной библиотеки.

Некоторые библиотеки(либо некоторые компоненты библиотек) в KolibriOS требуют для начала работы сделать инициализацию, LibImg и Buf2D — это одни из таких библиотек.
Есть функция InitLibrary, которая принимает в качестве параметра указатель на процедуру 'lib_init' из загружаемой библиотеки.
Также необходимо иметь функции для выделения, освобождения и перераспределения памяти.
Соглашение вызова этих функций — StdCall, но при этом необходимо дополнительно сохранять регистры.
Предполагается, что эти функции могут быть заменены на свои собственные, например, у нас есть менеджер памяти FastMM, только не забывать про сохранение регистров.

InitLibrary и необходимые дополнительные функции
function MemoryAllocate(Bytes: LongWord): Pointer; stdcall;
asm
        push ecx
        push ebx
        mov eax, 68
        mov ebx, 12
        mov ecx, Bytes
        int 64
        pop ebx
        pop ecx
end;

function MemoryReallocate(MemPtr: Pointer; Bytes: LongWord): Pointer; stdcall;
asm
        push ebx
        push ecx
        push edx
        mov eax, 68
        mov ebx, 20
        mov ecx, Bytes
        mov edx, MemPtr
        int 64
        pop edx
        pop ecx
        pop ebx
end;

function MemoryFree(MemPtr: Pointer): LongWord; stdcall;
asm
        push ecx
        push ebx
        mov eax, 68
        mov ebx, 13
        mov ecx, MemPtr
        int 64
        pop ebx
        pop ecx
end;

type
  Proc = procedure;

procedure InitLibrary(LibInit: Proc); stdcall;
asm
        pushad
        mov eax, offset MemoryAllocate
        mov ebx, offset MemoryFree
        mov ecx, offset MemoryReallocate
        mov edx, offset @dll_load
        call LibInit
        popad
        jmp @DllInit_exit
  @dll_load:
        push ebp
        mov  ebp, esp
        push ebx
        push esi
        push edi
        mov  esi, [ebp + 8]
  @next_lib:
        mov  edx, [esi]
        or   edx, edx
        jz  @exit
        push esi
        mov  esi, [esi + 4]
        mov  edi, offset @lib_name
  @b:
        lodsb
        stosb
        or al, al
        jnz  @b
        push offset @lib_path
        call LoadLibrary
        or  eax, eax
        jz  @fail
        mov  ecx, [eax]
        cmp  dword ptr [ecx], 'lib_'
        jne  @skip_init
        cmp  dword ptr [ecx + 4], 'init'
        jne  @skip_init
        push dword ptr [eax + 4]
        call InitLibrary
  @skip_init:
        mov  ecx, eax
        mov  ebx, edx
        test edx, edx
        jz  @done
  @next:
        mov  eax, [ebx]
        test eax, eax
        jz  @done
        push eax
        push ecx
        call GetProcAddress
        or eax, eax
        jz  @f
        mov [ebx], eax
        add ebx, 4
        jmp  @next
  @f:
        mov dword ptr [esp], eax
  @done:
        pop esi
        add esi, 8
        jmp  @next_lib
  @exit:
        xor eax, eax
        jmp @return
  @fail:
        pop esi
        inc eax
  @return:
        pop edi
        pop esi
        pop ebx
        pop ebp
        ret 4
  @lib_path: db '/sys/lib/'
  @lib_name: db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  @DllInit_exit:
end;

7

Re: Библиотеки в KolibriOS

На форуме KolibriOS выложена ссылка на clink — компоновщик нескольких COFF-файлов в один. Автор — Магомед Костоев (boppan) из KolbriOS.