Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб ноя 18, 2017 9:13 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 203 сообщения ]  На страницу Пред. 110 11 12 13 14
Автор Сообщение
 Заголовок сообщения: Re: C--
СообщениеДобавлено: Вс июл 16, 2017 6:02 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1080
Но в данном случае почему-то они как раз вставились.
Хотя судя по линкер-скрипту после .bss ничего не должно быть.
Получается, что вставились именно нули из .bss.
И действительно, Section length у .bss = 0x714C0 = 453 Kb

Хм.. попробовал в линкер-скрипте не пихать всё в одну секцию, а вынести .bss отдельно:
Спойлер: Показать
Код:
PATH_SIZE    =  1024;
PARAMS_SIZE  =   256;
STACK_SIZE   =  1024;

SECTIONS{
  .all : AT(0){
    LONG(0x554e454D);
    LONG(0x31305445);
    LONG(1);
    LONG("main");
    LONG(end);
    LONG(end + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
    LONG(end + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
    LONG(end + PATH_SIZE);
    LONG(end);
    *(.text) *(.text$*)
    *(.rdata) *(.rdata$*)
    *(.data) *(.data$*)
  }
  .bss : {*(.bss)}
  end = .;
  /DISCARD/ : {*(.eh_frame)} 
}

В результате выходной размер стал 112 Kb.

Всё же, чтобы работало правильно нужно использовать данные не из заголовка в kolibri.h, а из линкер-скрипта.


Вернуться к началу
 Заголовок сообщения: Re: C--
СообщениеДобавлено: Вс июл 16, 2017 6:43 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 85
Да это всё вообще неважно. Всё равно нулевые данные прекрасно сжимаются.


Вернуться к началу
 Заголовок сообщения: Re: C--
СообщениеДобавлено: Сб авг 26, 2017 10:56 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4226
Компилятор С--

C-- | CMM | Си минус минус (для поиска)


Вложения:
c--.7z [392.58 КБ]
23 скачивания

_________________
Через тернии к звездам
Вернуться к началу
 Заголовок сообщения: Re: C--
СообщениеДобавлено: Ср сен 06, 2017 12:45 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1080
А кто-нибудь пробовал делать библиотеки для KolibriOS на С--?
Это ведь очень просто. Пример библиотеки из 3-ёх ничего не делающих функций:
Код:
dword EXPORTS[] = {#szProc1, #Proc1,
                   #szProc2, #Proc2,
                   #szProc3, #Proc3,
                          0,      0};

char szProc1[] = "Proc1\0";
char szProc2[] = "Proc2\0";
char szProc3[] = "Proc3\0";

void Proc1(){}
void Proc2(){}
void Proc3(){}
и вот так собирается:
Код:
C-- test.c-- /w32 /sobj
LINK -edit test.obj

Только почему-то у полученного объектного файла SizeOfStringTable = 0.
Непонятно, из-за чего именно так(из-за самого С-- или уже после конвертации).
Мой CoffDump viewtopic.php?f=9&t=3577, конечно, ругается на это, а вот другие утилиты почему-то нет.
Вот что написано в документации по этому поводу:
Цитата:
5.6. COFF String Table

Immediately following the COFF symbol table is the COFF string table. The position
of this table is found by taking the symbol table address in the COFF header and
adding the number of symbols multiplied by the size of a symbol.

At the beginning of the COFF string table are 4 bytes that contain the total size (in
bytes) of the rest of the string table. This size includes the size field itself, so that
the value in this location would be 4 if no strings were present.

Following the size are null-terminated strings that are pointed to by symbols in the
COFF symbol table.
То есть, как минимум там должно быть 4. И в CoffDump есть проверка
Код:
If SizeOfStringTable < 4 Then Exit;
Получается, что всё-таки файл не совсем валидный.


Вернуться к началу
 Заголовок сообщения: Re: C--
СообщениеДобавлено: Ср сен 06, 2017 1:15 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1080
Как оказалось, формат coff тоже поддерживается.
Только нужно указать вот такие ключи:
Код:
C-- test.c-- /w32 /sobj /COFF
Создался coff файл с двумя секциями ".codedat" и ".version".
Так что, выходит, что конвертировать не обязательно. Только нужно учитывать, что имя секции другое.
А если указать просто:
Код:
C-- test.c--  /COFF
То тогда coff не создастся(как можно было подумать), а создастся приложение MS-DOS "test.com".


Вернуться к началу
 Заголовок сообщения: Re: C--
СообщениеДобавлено: Ср сен 06, 2017 8:14 am 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
Я тестировал совместимость
viewtopic.php?f=33&t=3418

Прямо сейчас примеров нет под рукой, но особых проблем не было.


Вернуться к началу
 Заголовок сообщения: Re: C--
СообщениеДобавлено: Ср сен 06, 2017 2:51 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1080
Да, действительно, формат COFF для библиотек был выбран очень удачно — чуть ли не каждый инструмент может создать COFF.
А для PE DLL бывает нужен ещё и линкер.
Что же касается
Цитата:
невозможно собрать из нескольких объектных файлов одну библиотеку
существует утилита elf2coff. Можно попробовать из нескольких COFF сделать ELF, а потом из полученного ELF сделать один COFF.


Вернуться к началу
 Заголовок сообщения: Re: C--
СообщениеДобавлено: Ср сен 13, 2017 4:10 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1080
Решил ещё попробовать использовать функции из masm32lib.

Здесь есть проблема: masm декорирует stdcall-функции.

Попробовал объявлять так
Код:
extern WINAPI ""
{
   _FloatToStr@12 ;
}

но такая конструкция всё равно не заработала

есть вариант пересобрать masm32.lib с помощью masm-совместимого uasm(http://www.terraspace.co.uk/uasm.html)
у uasm есть ключик для отключения декорирования stdcall-функций
Код:
-zt<0|1|2>           Set STDCALL symbol decoration: 0=No name decoration,
                     1=No '@size' suffix for functions, 2=Full (default)
в самом masm я такой возможности не обнаружил

тогда в make.bat из папки masm32\m32lib для masm32.lib надо будет заменить эту строку
Код:
\masm32\bin\ml /c /coff @ml.rsp
на эту
Код:
uasm32 /c /coff /zt0 @ml.rsp


Всё успешно собралось.
Если вдруг кому надо
Вложение:
masm32lib(builded_with_uasm).7z [29.11 КБ]
3 скачивания
Это всего лишь пересобранная версия, так что, Windows-специфичные функции(FrameWindow, DisplayIcon, ...) работать не будут.

Вот такой код вполне работает
Спойлер: Показать
Код:
// Import from KolibriOS.lib:
extern void  stdcall ThreadTerminate();
extern dword stdcall LoadLibrary(char* Path);
extern dword stdcall GetProcAddress(dword hLib; char* ProcName);
// Import from masm32.lib:
extern void  stdcall FloatToStr(double fpin, char* szDbl);

dword hConsole;

void stdcall (*ConsoleInit)(dword WndWidth, WndHeight, ScrWidth, ScrHeight; char* Caption);
void stdcall (*ConsoleExit)(dword bCloseWindow);
void stdcall (*Write)(char* string);

#define PI (double)3.14159265359
#define E  (double)2.71828182846

void Main(){
  char buf[20];

  hConsole    = LoadLibrary("/sys/lib/console.obj");
  ConsoleInit = GetProcAddress(hConsole, "con_init");
  ConsoleExit = GetProcAddress(hConsole, "con_exit");
  Write       = GetProcAddress(hConsole, "con_write_asciiz");

  ConsoleInit(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, "Test");

  FloatToStr(1.5, #buf);        Write(#buf); Write("\n");
  FloatToStr(-13.42, #buf);     Write(#buf); Write("\n");
  FloatToStr(2.71e2, #buf);     Write(#buf); Write("\n");
  FloatToStr(0.1234E-13, #buf); Write(#buf); Write("\n");
  FloatToStr(PI, #buf);         Write(#buf); Write("\n");
  FloatToStr(E, #buf);          Write(#buf); Write("\n");

  ConsoleExit(0);
  ThreadTerminate();
}
только похоже, что вывод PI и E был короче, чем double.
Спойлер: Показать
Вложение:
masm32lib.PNG
masm32lib.PNG [ 3.03 КБ | 139 просмотров ]
вероятно, C-- не поддерживает double в полной мере.

Размер получился немного больше, так как, судя по map-файлу кроме fptoa также был включен atofp из-за того что там находится функция PowerOf10.

Может, что-то можно было ещё у C-- или у LD подкрутить, чтобы обойтись без пересборки masm32.lib.

Но в любом случае есть возможность использовать код из masm32.lib
У масм-совместимого uasm там, кстати, даже такой ключик есть
Код:
-Zne                 Disable syntax extensions not supported by Masm
Для сборки примера также нужна KolibriOS.lib, взять её можно в теме Delphi7 examples viewtopic.php?f=33&t=3469
Вложение:
test(masm32lib).7z [1.03 КБ]
3 скачивания


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 203 сообщения ]  На страницу Пред. 110 11 12 13 14

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB