Kolibri libc - своя libc

Discussing libraries simplifying applications development
  • Да там изучать нечего всё в файле tccmeos.c Я знаю как добавить. Но мне некогда. + Есть пример на фасме с dll.obj?
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Привет!
    Да, я понял, что код для Kolibri генерит tccmeos.c. Но правкой в нем дело не ограничится. Таблица импорта используется другая, ее обработка идет с конца через кучу промежуточных указателей, кроме того сама таблица размазана по всему файлу, имена библиотек зачем то задаются с магическими символами + флаг загрузки и с полным путем. Все это занимает слишком много места в образе и чрезвычайно не оптимально. Сам код загрузчика прикручен гайками к dll.inc, не используя его по прямому назначению. Все что нужно было сделать - это построить правильную таблицу импорта (см. ниже) и скормить ее Dll.Load, он всю работу сам делает. Соответственно, загрузчик крайне неоптимальный (например на каждой функции вызывается load_library, который постоянно проверяет не загружена ли библиотека). Я понимаю, что все это работает, но dll.inc (и соответственно dll.obj) использует совершенно другой более компактный формат таблицы импорта (хотя и его можно уменьшить). В текущем виде это не сможет использоваться с dll.obj, нужно приводить таблицу импорта к формату, который задается макросами library и import из файла macros.inc.

    Code: Select all

    ...
    include '../../macros.inc'
    ...
    
    align 4
     ; Import table
        @IMPORT:
        library foo_lib, 'foo.obj'
        import  foo_lib, \
          foo_bar1, 'foo_bar1',    \
          foo_bar2, 'foo2'
    
    
    Также я пытался вчера понять, как строится таблица импорта. Как я понял импорты генерятся не ktcc, т.е. он ничего про импорты не знает. Похоже на какие то танцы с бубном.
    Расскажи поподробнее как происходит сборка приложения.
  • tcc по сути тут не причём. С таблицами импорта он не работает. Всё работает через crt0.o и libc.obj.a. Я так понял, что в libc.obj.a содежатся объектные файлы для каждой импортируемой функции. В них содержится указатель и имя функции. crt0.o читает эти данные и импортирует функции из динамической либы.
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Ты очень много говоришь и я не понимаю. Мне нужен живой пример для импорт например console.obj через твою dll.obj на фасме
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • turbocat wrote:Мне нужен живой пример для импорт например console.obj через твою dll.obj на фасме
    Во вложении, если надо подправь пути. Можно загружать в mtdbg, но загрузка идет сначала в dll.obj, пропускай все F8 пока не увидишь push eax - вызов точки входа приложения, чтобы зайти нажимай F7

    Также добавил dll.obj, обнови его в образе, т.к. Tup заработал, но выдал ошибки по последним ревизиям.
    Attachments
    Downloaded 177 times
  • Спасибо! Сейчас посмотрю. Охринеть тупу плохо.
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Coldy wrote:
    turbocat wrote:Мне нужен живой пример для импорт например console.obj через твою dll.obj на фасме
    Во вложении, если надо подправь пути. Можно загружать в mtdbg, но загрузка идет сначала в dll.obj, пропускай все F8 пока не увидишь push eax - вызов точки входа приложения, чтобы зайти нажимай F7

    Также добавил dll.obj, обнови его в образе, т.к. Tup заработал, но выдал ошибки по последним ревизиям.
    Я что то запустил пример твой сегодня... Не работает... Крашится
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Только что проверил на последней сборке (#8929), все работает нормально. Единственное - когда я загрузился первый раз были какие то глюки с сообщениями об ошибке загрузки библиотеки box_lib.obj. Потом после перезагрузки каким то волшебный все заработало нормально.
  • Окей чекну завтра. Может туплю
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Привет!
    Функция _ksys_exec ведет себя непредсказуемо, причина - отсутствие установки нуля для поля ksys70_t p20. Если повезет, то там будет ноль и приложение запустится.
    Также ноль необходимо устанавливать для p12 и p16. Пока все работает нормально, но если функция 70.7 будет модернизирована, то будут очередные сюрпризы.

    Code: Select all

     
    static inline
    int _ksys_exec(char *app_name, char *args)
    {
        ksys70_t file_opt;
        file_opt.p00 = 7;
        file_opt.p04dw = 0;
        file_opt.p08dw = (unsigned)args;
        
        // For future compatible p12 & p 16 must be zero
        file_opt.p12 = 0; 
        file_opt.p16 = 0;
        
       file_opt.p20 = 0; // <<==  Zero reqired!
       
        file_opt.p21 = app_name;
        return _ksys_work_files(&file_opt);
    }
  • Спасибо что сказал. Исправлю. Хотя если уверен можешь и сам исправить.
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Исправлено в #9463
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • В libc.obj был баг при использовании sscanf(...): не считывались строки. Например, sscanf("0,0,0", "%d,%d,%d", &a, &b, &c) не работал так, как должен.
    Исправил его, а также исправил баг с попыткой считывания шестнадцатеричных и восьмеричных чисел (в той же функции).
    Исправленный файл приложил, его нужно загрузить в /programs/develop/ktcc/trunk/libc.obj/source/stdio/format_scan.c. Загрузите на SVN (у меня нет доступа к нему).
    Attachments
    format_scan.c (12.33 KiB)
    Downloaded 102 times
  • vitalkrilov wrote:Исправленный файл приложил, его нужно загрузить в /programs/develop/ktcc/trunk/libc.obj/source/stdio/format_scan.c. Загрузите на SVN (у меня нет доступа к нему).
    Загрузил в рев. #9529
  • Who is online

    Users browsing this forum: No registered users and 2 guests