Page 3 of 4
Re: порт SQLite 1.0
Posted: Sun Nov 09, 2008 2:25 pm
by barsuk
vectoroc wrote:gcc линкует набор ".obj" файлов (COFF) в ".a" файл. Студия наверно поступает подобным же образом, кладёт .obj файлы в ".lib" (кстати, у этого файла в самом начале написано !<arch>)
Не очень понял, к чему это...
Serge wrote:Компилируй через ассемблер. В итоге объектник будет раза в три меньше.
Написал такой вот asm_code.asm:
Code: Select all
format MS COFF
align 4
public EXPORTS
extrn sqlite_open
extrn sqlite_exec
sqlite_open_name db 'sqlite_open',0
sqlite_exec_name db 'sqlite_exec',0
EXPORTS dd sqlite_open_name, sqlite_open, sqlite_exec_name, sqlite_exec
После компиляции получается obj-файл в 240 байт, содержащий ссылки на sqlite_open и sqlite_exec. Как сделать так, чтобы необходимые элементы из sqlite.obj были включены в него?
Re: порт SQLite 1.0
Posted: Sun Nov 09, 2008 3:02 pm
by Serge
barsuk
Я про другое. Ставишь в опциях Assembly-Only Listing (/FA), правишь его и компилируешь masm: ml /c <file>
Если такие заморочки c obj может сделать inc файл для загрузки pe dll в asm программах ?
Re: порт SQLite 1.0
Posted: Sun Nov 09, 2008 4:01 pm
by bw
> может сделать inc файл для загрузки pe dll в asm программах ?
Ну тогда не inc (зачем же остальных обламывать), а динамическую COFF-библиотеку.
..bw
Re: порт SQLite 1.0
Posted: Sun Nov 09, 2008 4:11 pm
by barsuk
Serge
Сделал так. Добавил в asm-файл таблицу экспорта, как положено. Действительно, результат гораздо компактнее, чем в VC. Однако, при попытке просмотреть obj-файл с помощью cobj вылетает ошибка "Memory request failed" (под эмулятором).
Re: порт SQLite 1.0
Posted: Sun Nov 09, 2008 4:12 pm
by vectoroc
Я тогда не очень понял, как ты пытался скомпилять библиотеку
Re: порт SQLite 1.0
Posted: Sun Nov 09, 2008 4:22 pm
by barsuk
vectoroc
DLL-библиотека в Колибри это COFF OBJ файл. Его я и пытался сделать. Для этого написал один с-файл, в который заинклюдил все с-файлы проекта. Получился 1 obj-файл.
Re: порт SQLite 1.0
Posted: Sun Nov 09, 2008 8:02 pm
by Serge
barsuk
Зачем в asm файл ? Всё на С.
Code: Select all
typedef struct
{
char *name;
void *f;
}export_t;
char szCreatePixmap[] = "CreatePixmap";
char szDestroyPixmap[] = "DestroyPixmap";
export_t EXPORTS[] =
{
{ szStart, start },
{ szVersion, (void*)0x00010001 },
{ szCreatePixmap, CreatePixmap },
{ szDestroyPixmap, DestroyPixmap },
{ NULL, NULL },
};
Я компилирую mingw. Там немного проще - можно прямо указать имя
export_t EXPORTS[] __asm__("EXPORTS")
Скачал объектник, попробую разобраться.
Посмотрел. Там OMF. Надо компилировать ml /c /coff
bw Наверное ты прав. Если несколько библиотек и перекрёстные ссылки одним инклюдом не обойдёшся. Хотя со стороны выглядит довольно идиотски.
Re: порт SQLite 1.0
Posted: Mon Nov 10, 2008 2:10 am
by barsuk
Serge wrote:Зачем в asm файл ? Всё на С.
VC++, увы, не умеет не ставить "_" перед экспортируемыми символами.
Serge wrote:Посмотрел. Там OMF. Надо компилировать ml /c /coff
Скомпилировал - все равно не загружается... Файл приложил.
Re: порт SQLite 1.0
Posted: Mon Nov 10, 2008 8:17 am
by Serge
Так всё экспортируется через таблицу EXPORTS. Надо исправить только этот символ.
Re: порт SQLite 1.0
Posted: Mon Nov 10, 2008 9:20 am
by Serge
Загрузчик ограничивал длину всех символов до 16 знаков а СРР делает очень длинные имена. Теперь длина увеличена 256. Вторая хорошая новость: если нет EXPORTS проверяется _EXPORTS.
Остались пять внешних ссылок:
Code: Select all
extrn __ftol:near ; CODE XREF: _roundFunc
; _sqliteRealToSortable
extrn _sqliteDir:near ; DATA XREF: _fopen
extrn _last_fileaccess_ebx:near
; DATA XREF: _kos_FileSystemAccess
extrn _debuf:near
extrn _atExitList:near ; DATA XREF: _atexit
; _kos_ExitApp
Это пишется и на доску отладки во время загрузки.
Лучше использовать нормальную malloc, 68.12 для этого плохо подходит.
Re: порт SQLite 1.0
Posted: Mon Nov 10, 2008 5:08 pm
by barsuk
Serge wrote:Загрузчик ограничивал длину всех символов до 16 знаков а СРР делает очень длинные имена. Теперь длина увеличена 256. Вторая хорошая новость: если нет EXPORTS проверяется _EXPORTS.
Спасибо, но не смог пока что воспользоваться: пересобрал trunk ядро, и теперь все приложения, которые используют DLL, падают с Page Fault.
Serge wrote:Лучше использовать нормальную malloc, 68.12 для этого плохо подходит.
Нормальный malloc - это malloc из mcsmemm.cpp в библиотеке для VC? Там используется функция 64, которая, как я понял, считается устаревшей.
Re: порт SQLite 1.0
Posted: Mon Nov 10, 2008 5:51 pm
by Serge
barsuk
Запусти под mtdbg. Здорово помогает.
Где-то есть версия для ф.68 Если malloc используется активно, попробуй этот. Он должен компилироваться и VC. Эта версия для драйвера. Надо заменить mem_alloc и mem_free на вызовы ф.68
Re: порт SQLite 1.0
Posted: Mon Nov 17, 2008 1:51 am
by Gluk
Re: порт SQLite 1.0
Posted: Mon Nov 17, 2008 7:34 pm
by barsuk
Постарался избавиться от внешних ссылок. Не загружается - вешает систему. На доске отладки ничего не видно.
Serge, чем из винды удобно смотреть внешние ссылки coff obj файла?
Думаю, рановато еще... Надо хотя бы библиотеку собрать.
Re: порт SQLite 1.0
Posted: Mon Nov 17, 2008 7:39 pm
by bw
> Serge, чем из винды
И из линуха, и не только obj :-).
..bw