Я изучу код ktcc, посмотрю, как это можно прикрутить.
P.S. заголовок в crt0.asm взят в блок virtual, соответственно этих данных в crt0.o нет.
Т.е. это как бы внешнее определение, которое нужно внутри самого crt0.o, чтобы правильно построить ссылки.
Kolibri libc - своя libc
Да там изучать нечего всё в файле tccmeos.c Я знаю как добавить. Но мне некогда. + Есть пример на фасме с dll.obj?
Изобретайте колёса каждый раз, когда хотите написать новую программу.
Привет!
Да, я понял, что код для Kolibri генерит tccmeos.c. Но правкой в нем дело не ограничится. Таблица импорта используется другая, ее обработка идет с конца через кучу промежуточных указателей, кроме того сама таблица размазана по всему файлу, имена библиотек зачем то задаются с магическими символами + флаг загрузки и с полным путем. Все это занимает слишком много места в образе и чрезвычайно не оптимально. Сам код загрузчика прикручен гайками к dll.inc, не используя его по прямому назначению. Все что нужно было сделать - это построить правильную таблицу импорта (см. ниже) и скормить ее Dll.Load, он всю работу сам делает. Соответственно, загрузчик крайне неоптимальный (например на каждой функции вызывается load_library, который постоянно проверяет не загружена ли библиотека). Я понимаю, что все это работает, но dll.inc (и соответственно dll.obj) использует совершенно другой более компактный формат таблицы импорта (хотя и его можно уменьшить). В текущем виде это не сможет использоваться с dll.obj, нужно приводить таблицу импорта к формату, который задается макросами library и import из файла macros.inc.
Также я пытался вчера понять, как строится таблица импорта. Как я понял импорты генерятся не ktcc, т.е. он ничего про импорты не знает. Похоже на какие то танцы с бубном.
Расскажи поподробнее как происходит сборка приложения.
Да, я понял, что код для 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'
Расскажи поподробнее как происходит сборка приложения.
tcc по сути тут не причём. С таблицами импорта он не работает. Всё работает через crt0.o и libc.obj.a. Я так понял, что в libc.obj.a содежатся объектные файлы для каждой импортируемой функции. В них содержится указатель и имя функции. crt0.o читает эти данные и импортирует функции из динамической либы.
Изобретайте колёса каждый раз, когда хотите написать новую программу.
Ты очень много говоришь и я не понимаю. Мне нужен живой пример для импорт например console.obj через твою dll.obj на фасме
Изобретайте колёса каждый раз, когда хотите написать новую программу.
Во вложении, если надо подправь пути. Можно загружать в mtdbg, но загрузка идет сначала в dll.obj, пропускай все F8 пока не увидишь push eax - вызов точки входа приложения, чтобы зайти нажимай F7turbocat wrote:Мне нужен живой пример для импорт например console.obj через твою dll.obj на фасме
Также добавил dll.obj, обнови его в образе, т.к. Tup заработал, но выдал ошибки по последним ревизиям.
- Attachments
-
-
hello_console_h2.7z (36.54 KiB)Downloaded 197 times
-
Спасибо! Сейчас посмотрю. Охринеть тупу плохо.
Изобретайте колёса каждый раз, когда хотите написать новую программу.
Я что то запустил пример твой сегодня... Не работает... КрашитсяColdy wrote:Во вложении, если надо подправь пути. Можно загружать в mtdbg, но загрузка идет сначала в dll.obj, пропускай все F8 пока не увидишь push eax - вызов точки входа приложения, чтобы зайти нажимай F7turbocat wrote:Мне нужен живой пример для импорт например console.obj через твою dll.obj на фасме
Также добавил dll.obj, обнови его в образе, т.к. Tup заработал, но выдал ошибки по последним ревизиям.
Изобретайте колёса каждый раз, когда хотите написать новую программу.
Только что проверил на последней сборке (#8929), все работает нормально. Единственное - когда я загрузился первый раз были какие то глюки с сообщениями об ошибке загрузки библиотеки box_lib.obj. Потом после перезагрузки каким то волшебный все заработало нормально.
Окей чекну завтра. Может туплю
Изобретайте колёса каждый раз, когда хотите написать новую программу.
Привет!
Функция _ksys_exec ведет себя непредсказуемо, причина - отсутствие установки нуля для поля ksys70_t p20. Если повезет, то там будет ноль и приложение запустится.
Также ноль необходимо устанавливать для p12 и p16. Пока все работает нормально, но если функция 70.7 будет модернизирована, то будут очередные сюрпризы.
Функция _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 (у меня нет доступа к нему).
Исправил его, а также исправил баг с попыткой считывания шестнадцатеричных и восьмеричных чисел (в той же функции).
Исправленный файл приложил, его нужно загрузить в /programs/develop/ktcc/trunk/libc.obj/source/stdio/format_scan.c. Загрузите на SVN (у меня нет доступа к нему).
- Attachments
-
-
format_scan.c (12.33 KiB)Downloaded 113 times
-
Загрузил в рев. #9529vitalkrilov wrote:Исправленный файл приложил, его нужно загрузить в /programs/develop/ktcc/trunk/libc.obj/source/stdio/format_scan.c. Загрузите на SVN (у меня нет доступа к нему).
Who is online
Users browsing this forum: No registered users and 2 guests