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
можно здесь - http://www.sqlite.org/cvstrac/wiki?p=SqlitePorts отметиться =)

Re: порт SQLite 1.0

Posted: Mon Nov 17, 2008 7:34 pm
by barsuk
Постарался избавиться от внешних ссылок. Не загружается - вешает систему. На доске отладки ничего не видно.

Serge, чем из винды удобно смотреть внешние ссылки coff obj файла?
Gluk wrote:можно здесь - http://www.sqlite.org/cvstrac/wiki?p=SqlitePorts отметиться =)
Думаю, рановато еще... Надо хотя бы библиотеку собрать.

Re: порт SQLite 1.0

Posted: Mon Nov 17, 2008 7:39 pm
by bw
> Serge, чем из винды
И из линуха, и не только obj :-).

..bw