Tiny C Compiler

...
  • Компилятор не может найти start.o

    Запускал с помощью Run с такими параметрами:

    /usbhd0/1/ktcc_26_161007/tcc /usbhd0/1/ktcc_26_161007/samples/consoleio.c -o /usbhd0/1/ktcc_26_161007/samples/consoleio -lck -B /usbhd0/1/ktcc_26_161007

    Раскидал start.o по всем папкам, но безрезультатно. libck.a и conio.h находит без проблем. ЧЯДНТ?
  • Есть какая то проблема с относительными путями в КОС, ключ -B не отрабатывает. Нужно зайти в папку с tcc и оттуда запускаться

    Т.е в консоли (shell)
    cd /usbhd0/1/ktcc_26_161007
    tcc samples/consoleio.c -o samples/consoleio -lck

    Если верить моему readme, еще вариант положить start.o рядом с .С файлом (возможно в текущую папку)
  • Siemargl wrote: Т.е в консоли (shell)
    cd /usbhd0/1/ktcc_26_161007
    tcc samples/consoleio.c -o samples/consoleio -lck
    Да, спасибо, это работает.
    Siemargl wrote:Есть какая то проблема с относительными путями в КОС, ключ -B не отрабатывает. Нужно зайти в папку с tcc и оттуда запускаться
    Проблема, видимо, не в KOS. Без ключа -B, компилятор не находит также conio.h, а с ключом находит.
  • akron1 wrote:
    Siemargl wrote:Есть какая то проблема с относительными путями в КОС, ключ -B не отрабатывает. Нужно зайти в папку с tcc и оттуда запускаться
    Проблема, видимо, не в KOS. Без ключа -B, компилятор не находит также conio.h, а с ключом находит.
    Возможно, еще ньюансы реализации. Заголовки должны искаться по ключу -I, а -B например в Win32 версии Tcc работает.

    Когда нибудь доберусь - в ридми есть целый список errata, чего бы еще поправить и улучшить.
  • У меня возникает ошибка, когда ktcc, собранный на Win32, при линковке приложения для KOS падает в Segmentation fault. kTcc собранный для Kolibri, и запущенный под Kolibri нормально линкует при этих же параметрах. При поиске ошибки с удивлением для себя обнаружил заголовок MENUET02 там, где должна быть BSS секция(в kex файле, собранным kTcc из-под Kolibri).
    Примерно понял в чем ошибка, приведу правленный мною код, который заработал нормально на обеих платформах(tccmeos.c):

    Code: Select all

    int tcc_output_me(TCCState* s1,const char *filename)
    {
    	me_info me;
        int i;
    	int offset;
        FILE* f;
        //printf("%d\n",s1->nb_sections);
    	memset(&me,0,sizeof(me));
    	me.s1=s1;
    	relocate_common_syms();
    	assign_addresses(&me);
    
    	if (s1->do_debug)
    		tcc_output_dbgme(filename, &me);
    
    	me.header.entry_point=tcc_find_symbol_me(&me,"start");
    	me.header.params= tcc_find_symbol_me(&me,"__argv"); // <--
    	me.header.argv= tcc_find_symbol_me(&me,"__path"); // <--
    
    	f=fopen(filename,"wb");
    	offset=0;
        for (i=0;i<8;i++)
            me.header.magic[i]=me_magic[i];
    	/*me.header.magic[0]='M';me.header.magic[1]='E';
    	me.header.magic[2]='N';me.header.magic[3]='U';
    	me.header.magic[4]='E';me.header.magic[5]='T';
    	me.header.magic[6]='0';me.header.magic[7]='1';*/
    	printf("\nHeader at:%i",offset);
    	offset+=fwrite(&me.header,1,sizeof(IMAGE_MEOS_FILE_HEADER),f);
    	meos_section_info* si;
    	printf("\nCode at:%i",offset);
    	for(si=me.code_sections;si;si=si->next)
    		offset+=fwrite(si->data,1,si->data_size,f);
    	printf("\nData at:%i",offset);
    	for (si=me.data_sections;si;si=si->next)
    		offset+=fwrite(si->data,1,si->data_size,f);
    	printf("\nBSS at:%i",offset);
    	for (si=me.bss_sections;si;si=si->next){
    		//my mod
    		if (si->data==NULL){
    			printf("\nError! BSS data is NULL! size:%i",(int)si->data_size);
    			si->data=calloc(si->data_size,1);
    		}
    		//end my mod
    		offset+=fwrite(si->data,1,si->data_size,f);
    	}
    	printf("\nComplete! Writed %i bytes.\n",offset);
    /*
        if (me.bss_sections) // Siemargl testin, what we lose
        {
            tcc_error_noabort("We lose .BSS section when linking KOS32 executable");
        }
    */
    	fclose(f);
    	return 0;
    }
    
    Изменено:

    Code: Select all

    		//my mod
    		if (si->data==NULL){
    			printf("\nError! BSS data is NULL! size:%i",(int)si->data_size);
    			si->data=calloc(si->data_size,1);
    		}
    		//end my mod
    
    а KTCC из под Kolibri может успешно читать из NULL образ своего же запущеного процесса. И записывать в файл. Но это может привести к серьезным ошибкам, поскольку данные в BSS должны быть нулями в момент запуска процесса. То есть ktcc может генерировать бинарники с багами.
  • Внес в SVN. Хотя что нулям не место в бинарнике, но мусору там точно не должно быть.
    В принципе, бинарники обычно kpack-уются, так что неважно.
    Но по хорошему, загрузчик должен инициализировать .bss, в чем я в Колибри не уверен.

    В редакциях <=6429 BSS вообще не писался.

    На самом деле, в плане работ по tcc, есть интересная другая ветка https://github.com/mirror/tinycc, с которой бы смержиться когда либо.
    В ней работает __fastcall и --bounds_check, хотя сходу не захотел печатать стек при нарушении границ.
  • Siemargl wrote: Но по хорошему, загрузчик должен инициализировать .bss, в чем я в Колибри не уверен.
    Можешь не сомневаться. Ядро всегда обнуляет память, выделяемую для приложения.
  • Здравствуйте, tcc не запускается на реальной машине ничего не выводя на доску отладки и не показывая ошибок.
    Ноутбук очень старый, не запускает некоторые программы такие как animage ругаясь на неподдерживаемые инструкции!
  • Какй процессор, модель ноутбука?
    Из хаоса в космос
  • Leency wrote:Какй процессор, модель ноутбука?
    На обороте написано что satellite 1625cdt/4.3
    Кажется AMD K6.
  • p1a wrote:
    Leency wrote:Какй процессор, модель ноутбука?
    На обороте написано что satellite 1625cdt/4.3
    Кажется AMD K6.
    запускаешь под колибри или под windows ?

    можно собрать версию под старые процы, хотя с этим проблема - надо и newlib пересобирать под К6 (
  • Siemargl wrote:
    p1a wrote:
    Leency wrote:Какй процессор, модель ноутбука?
    На обороте написано что satellite 1625cdt/4.3
    Кажется AMD K6.
    запускаешь под колибри или под windows ?

    можно собрать версию под старые процы, хотя с этим проблема - надо и newlib пересобирать под К6 (
    Запускал только под колибри, может стоит попробовать ещё где-то.
    Никогда ничего не собирал под другую архитектуру(.
  • Обновленная версия - мартовская 2018, Startrek Edition.

    Добавлена буферизация чтения в libck - иначе Стартрек несколько минут побайтово читал хелп-файл с виртуального /fd0/1.
    Также добавлены несколько функций в libck, и в ней же исправлены обнаруженные при работе ошибки.

    Обновлено от сентября 2018, поправлено возвращаемое значение fwrite,
    неверный импорт из coff при похожих именах (в частности вместо con_getch2 линковалась con_getch)

    Обновлено октябрь 2018 - забытые исправления из транка.
    Attachments
    tcc_26_181012.zip (268.24 KiB)
    Downloaded 278 times
    Last edited by Siemargl on Fri Oct 12, 2018 12:22 pm, edited 2 times in total.
  • Ошибка при компиляции примера

    Code: Select all

    >kos32-tcc.exe samples\winbasics.c -lck
    In file included from samples/winbasics.c:10:
    include/kos32sys1.h:579: error: field 'zero' has incomplete type
    Ошибки при сборке libc

    Code: Select all

    In file included from stdio/printf.c:3:
    include/conio.h:18:23: ошибка: несовместимые типы для «dword»
     typedef unsigned long dword; /* 32-bit unsigned integer */
                           ^~~~~
    In file included from include/stdlib.h:3,
                     from stdio/printf.c:1:
    include/kolibrisys.h:19:22: замечание: здесь была предыдущая декларация «dword»
     typedef unsigned int dword;
                          ^~~~~
                          
    string/is.c:2:16: ошибка: несовместимые типы для «__is»
     unsigned short __is[129] = {
                    ^~~~
    In file included from string/is.c:1:
    include/ctype.h:21:23: замечание: здесь была предыдущая декларация «__is»
     extern unsigned short __is[128];
    
    gcc-8.2.1 x86_64
  • Who is online

    Users browsing this forum: No registered users and 2 guests