Загрузка библиотек

Internal structure and you change requests/suggestions
  • Скопировал из чата:
    //DG « Ср окт 19, 2016 7:03 pm » CleverMouse, как предполагается пользоваться kolibri.dll из \os? Есть какой-нибудь мануал?
    CleverMouse « Ср окт 19, 2016 7:08 pm » //DG: предполагается, что она будет грузиться автоматически ядром
    //DG « Ср окт 19, 2016 7:15 pm » Ок, а стандартные GetProcAddress есть или их надо тащить свои с программой? Это же PE DLL?
    //DG « Ср окт 19, 2016 7:17 pm » И сейчас оно не грузится автоматом, верно? Мне нужен аллокатор, думаю прикрутить вместо kolibri.asm другой файл для формирования .obj; Динамические файлы obj шарятся между процессами как обычно?
    //DG « Ср окт 19, 2016 7:19 pm » 68.19 грузит .obj бибилиотеки?
    0CodErr « Ср окт 19, 2016 7:20 pm » Ну вообще, если мы планируем сохранять обратную совместимость, то должна быть возможность грузить библиотеки с помощью SysFn68.19 и получать указатель на таблицу экспорта DLL
    0CodErr « Ср окт 19, 2016 7:20 pm » //DG: да, 68.19 грузит .obj
    //DG « Ср окт 19, 2016 9:23 pm » Если перелицевать \os под .obj тот же функуионал останется, только ее станет возможным грузить через 19ф. Пожалуй, возьму этот аллокатор. Теперь осталось изучить ваш процесс сборки (кто-нибудь может меня ткнуть носом в документ?)
    CleverMouse « Ср окт 19, 2016 9:24 pm » //DG: прямо сейчас загрузить транковым ядром kolibri.dll как есть вообще нельзя
    CleverMouse « Ср окт 19, 2016 9:24 pm » когда-нибудь будет можно
    //DG « Ср окт 19, 2016 9:24 pm » "получать указатель на таблицу экспорта DLL" Мне казалось, что у obj она всегда вначале... Где этот формат описан?
    //DG « Ср окт 19, 2016 9:25 pm » CleverMouse: а какие там ограничения? Просто ядро не грузит еще ПЕшки или есть какие-то подводные камни, если я буду под .obj переделывать?
    CleverMouse « Ср окт 19, 2016 9:30 pm » просто ядро не грузит PE, подводных камней вроде нет
    0CodErr « Ср окт 19, 2016 9:31 pm » CleverMouse: а это что делает? http://websvn.kolibrios.org/filedetails ... peload.inc
    CleverMouse « Ср окт 19, 2016 9:32 pm » 0CodErr: это для драйверов
    0CodErr « Ср окт 19, 2016 9:32 pm » CleverMouse: :) хм, странно, PE ведь же тоже.
    0CodErr « Ср окт 19, 2016 9:34 pm » CleverMouse: а что насчёт обратной совместимости при загрузке SysFn68.19 в будущем
    CleverMouse « Ср окт 19, 2016 9:38 pm » 0CodErr: PE DLL не нужно грузить функцией ядра. PE DLL нужно грузить вызовом одной из функций userspace-компонента kolibri.dll
    0CodErr « Ср окт 19, 2016 9:41 pm » CleverMouse: ну, хорошо, вот смотри, в той же винде можно делать loadlibrary+getprocaddress. В Колибри так нельзя будет?
    CleverMouse « Ср окт 19, 2016 9:42 pm » 0CodErr: так и будет, только loadlibrary/dlopen - это не вызов ядра, а функция в userspace
    0CodErr « Ср окт 19, 2016 9:43 pm » CleverMouse: а, ну понятно. То есть, 68.19 для PE работать не будет?
    CleverMouse « Ср окт 19, 2016 9:44 pm » 0CodErr: нет, не будет
    0CodErr « Ср окт 19, 2016 9:45 pm » CleverMouse: а останется ли поддержка MSCOFF библиотек?
    CleverMouse « Ср окт 19, 2016 9:47 pm » 0CodErr: на переходный период - да, только шаринг страниц между разными процессами перестанет иметь место для COFF, его неудобно поддерживать для COFF и PE сразу
  • Girls and guys,

    AFAIK from forums and chat logs a patch by CleverMouse implements all we need for PE. It is also a non-breaking change for existing applications. I rebased the patch to current svn trunk, checked and attached it.

    Is there any reason to not merge? Anything to discuss? We could finish transition to PE this year.
    Attachments
    pe2.diff (139.78 KiB)
    Downloaded 447 times
  • "Non-breaking change" - не совсем верно: для приложений изменения действительно прозрачны, но патч ломает разделение физической памяти под копиями COFF-библиотек в разных процессах.
    "all we need for PE" - совсем неверно: то, что есть, должно работать, но некоторых важных вещей нет. В порядке убывания важности:
    * вызов DllMain при загрузке/выгрузке DLL
    * static TLS (__declspec(thread) в msvc / __thread в gcc / _Thread_local в стандарте C11)
    * возврат из главной функции процесса должен приводить к завершению всех потоков процесса, а не только главного. Конфликтует с текущей реализацией консоли, поэтому окно консоли надо выносить в отдельный процесс - заодно позволит сделать консоль, разделяемую между несколькими процессами
    * биндилка импортов для автосборки
    Сделаем мир лучше!
  • Интересный вопрос насчёт иконок в StrippedPE.
    Директория ресурсов, как я понял, предусмотрена.
    Если хранить иконки там, то чтобы их оттуда достать(чтобы отобразить где-то) придётся сначала распаковать файл.
    Так как приложения у нас в данный момент не имеют расширения, то может получиться, что пред нами не приложение, а файл с какими-то данными(не важно), размером эдак 100Мб.
    В той теме http://board.kolibrios.org/viewtopic.php?f=26&t=3621 я пытался кое-что придумать, но видимо никому больше это не нужно.

    Просто интересно, как планируется работа с ресурсами, в частности с иконками.
  • Q for masters: how can OS share DLL between processes if in different ones the DLL may be loaded in different base addresses (and relocated, so that code of DLL in address space of App1 differs from code of DLL in App2's address space).

    I get the result on Windows: if some conditions are met, HMODULE of the same DLL in different apps may be different. Does it mean that Windows does not share DLL between apps or may sometimes have several instances of it loaded?
  • Yep, sometimes you can't map existing in memory DLL where is supposed to be (mb, the memory in process address space is already in use), so you have to make one more copy of DLL and relocate it again.
  • Ok, what's conclusion? Do we need new executable and library formats or kernel developers desided leave it as is?

    If kernel devs have any roadmap, let me see it, I'l try to help to imeplement anything in that direction.
  • Hi again,

    I merged the patch manually to the current master main trunk. It still works.
    CleverMouse wrote:"all we need for PE" - совсем неверно: то, что есть, должно работать, но некоторых важных вещей нет. В порядке убывания важности:
    * вызов DllMain при загрузке/выгрузке DLL
    * static TLS (__declspec(thread) в msvc / __thread в gcc / _Thread_local в стандарте C11)
    * возврат из главной функции процесса должен приводить к завершению всех потоков процесса, а не только главного. Конфликтует с текущей реализацией консоли, поэтому окно консоли надо выносить в отдельный процесс - заодно позволит сделать консоль, разделяемую между несколькими процессами
    * биндилка импортов для автосборки
    CleverMouse,
    you listed the tasks in priority order. Is it also the order to implement them?

    Could you describe the steps above in more detail in case somebody wants to work on PE.
    Attachments
    pe3.diff (145.12 KiB)
    Downloaded 291 times
  • Do you really want PE executables and libraries in KolibriOS? And no one aganist making system calls more indirect? And aganist a little executable files bloating? And aganist kernel-mode PE loader?

    If no kernel developer minds that, IT'S FRICKING GREAT!
  • 0CodErr wrote:Интересный вопрос насчёт иконок в StrippedPE.
    Директория ресурсов, как я понял, предусмотрена.
    Если хранить иконки там, то чтобы их оттуда достать(чтобы отобразить где-то) придётся сначала распаковать файл.
    Не обязательно сжимать весь файл - можно научиться сжимать и распаковывать отдельные секции, как это реализовано в эльфах.

    И изменения в формате PE лучше не слишком большие делать, шоб не было гемора с переписыванием кода существующих тулзов.
  • Boppan,

    It was agreed that (Stripped)PE will replace MENUETxx format for binaries and COFF for libraries.
    Afaik, nobody is working on it. You are welcome.

    PE examples are here. Things to implement are here.
  • IgorA wrote:rev 8236, 8237
    Программы free3d, use_mb, fasm, h2d2b, heed и несколько примеров перевел на новый макрос.
    да не балуйся уже с этим макросом, я озадачился загрузчик в ядро поместить.
    Совместимость с менуэтом00,01,02 будет сохранена, в отношении всех этих версий формата система научится грузить либы автоматом, но и если они не готовы грузить импорты автоматом такого происходить не будет.

    Code: Select all

    struct  APP_HEADER_IMPORTS
            banner          dq ?
            version         dd ?    ;+8
            start           dd ?    ;+12
            i_end           dd ?    ;+16
            mem_size        dd ?    ;+20
                            dd ?    ;+24
                            dd ?    ;+28
                            dd ?    ;+32
            imports         dd ?
    ends
    no matter what menuet version,
    will be tested content of [imports] field
    for imports take place will be tested
    that content of [imports] is non zero, content fits in initialized size stored in [i_end],
    and finaly that content of [imports] points to special marker.
    Если все условия будут соблюдены система сама раскрутит импорты.
    Если нет - поведение будет старое - т.е. совместимое.
  • ProMiNick wrote:да не балуйся уже с этим макросом, я озадачился загрузчик в ядро поместить.
    Coldy already implemented this about a year ago.
    It wasn't merged to trunk. May be because automatic loading of libraries was also implemented for PE.
    When somebody will implement features of this list, loading of libraries will be merged to trunk automatically.
    Your approach looks like a double work which you are free to do of course.
  • I have no idea how to implement features in the list. so if for a year PE couldn`t be released so it could be never released.
    But what i going to do now will make coding simplier already now, but not in abstraction future.
  • Who is online

    Users browsing this forum: No registered users and 7 guests