Tiny C Compiler

...
  • Привет!
    Обновил на svn последнюю версию, в т.ч. исправлена ошибка при задании неиспользуемых библиотек, добавлены доки, библиотеки.
    К сожалению, в дистрибутив сейчас многое не попадает (кроме самого tcc и tcc.conf) нужно это будет настроить позже.
    Для тестирования для понимания что должно быть в папке tcc ориентируйтесь на архив, который выкладывал выше.
  • В TCC баг замечен:
    Если использовать преобразование типов с плавающей запятой в целочисленный, то скомпилированная программа будет вылетать (в Board->Kernel видно).
    Пример кода:

    Code: Select all

    float a = 3.14f;
    int b = (int)a;
  • Привет!
    Собралось без проблем (архив в приложении). Возможно криво прилинковалась библиотека tcc. Используй вариант из дистрибутива, но в файле tcc.conf надо раскомментировать строку "tcc_root kx"
    Attachments
    f2i.7z (1.96 KiB)
    Downloaded 103 times
  • Coldy wrote:Привет!
    Собралось без проблем (архив в приложении). Возможно криво прилинковалась библиотека tcc. Используй вариант из дистрибутива, но в файле tcc.conf надо раскомментировать строку "tcc_root kx"
    Спасибо за ответ. Интересно получилось: я сравнил мой и твой вариант, и выходит, что необходимо сначала указать "-ltcc" и только потом "-lc.obj". Тогда все работает, как надо (даже что-то менять в tcc.conf не пришлось). Если же сделать наоборот, то будет возникать описанная мной ошибка.
    (libc.obj пришлось подключать для printf)
  • От разницы указаний библиотек не должно быть проблем - это вляет только на то в каком порядке они будут следовать в коде. Я к сожалению вижу только часть контекста твоей проблемы, возможно, проблема вовсе не в tcc, и даже не в порядке подключения библиотек. Например, текущий формат приложений позволяет легко затереть/перезаписать к.л. участок кода с помощью другой ошибки в коде - отловить это очень сложно.

    Да, tcc.conf пока лучше не править, т.к. CLAYER еще не переделан, но в дальнейшем библиотеки будут использоваться те, которые в папке kx/lib.
  • Coldy wrote:От разницы указаний библиотек не должно быть проблем - это вляет только на то в каком порядке они будут следовать в коде. Я к сожалению вижу только часть контекста твоей проблемы, возможно, проблема вовсе не в tcc, и даже не в порядке подключения библиотек. Например, текущий формат приложений позволяет легко затереть/перезаписать к.л. участок кода с помощью другой ошибки в коде - отловить это очень сложно.

    Да, tcc.conf пока лучше не править, т.к. CLAYER еще не переделан, но в дальнейшем библиотеки будут использоваться те, которые в папке kx/lib.
    Все то же самое, как и в твоем архиве. Но замени в скрипте билда "-ltcc" на "-lc.obj -ltcc". А в коде выведи полученное число:

    Code: Select all

    #include <stdio.h> //в начале
    printf("%d", b); // в конец main()
  • В итоге будет:

    Code: Select all

    #include <stdio.h>
    int main() {
    	float a = 3.14f;
    	int b = (int)a;
    	printf("%d", b);
    }
    
    Компиляция (из папки с исходником):

    Code: Select all

    /kolibrios/develop/tcc/tcc main.c -o a.kex -lc.obj -ltcc
    
  • Да, с использованием старой версии libc.obj.a (-lc.obj) ошибка появляется, как ты описал. Как уже писал ранее, libc.obj.a вскоре будет устаревшей.
    Подключи tcc.conf, как я описал выше.
    запусти tcc с ключом -vv, путь к библиотекам должен быть "/kolibrios/develop/tcc/kx/lib"
    затем используй сборку так

    Code: Select all

    /kolibrios/develop/tcc/tcc main.c -o a.kex -llibc -ltcc
    Можешь менять библиотеки местами, все будет работать нормально.

    И просьба не использовать оверквоттинг без надобности, нажимай кнопку "Ответить", вместо "Цитата"
    Last edited by Coldy on Thu Jan 06, 2022 10:32 pm, edited 1 time in total.
  • Так, я понял в чем проблема. Программа вылетает из-за того что у функции pfintf некорректный указатель (в примере с ошибкой он 0x318 чего быть по определению не может, правильный в мом случае - 0x7004D66B). Видимо старый загрузчик чувствителен к порядку указания библиотек - это еще один повод отказаться от этого метода.
  • Я тут поколдовал... Coldy, может сделать формат KX дефолтным для tcc в самом дистре? Нужные изменения я произвёл на своём пк, автособираемые проги не пострадают. Вот так tcc в дистре будет. Ты согласен?

    PS:
    Смысла два способа сборки держать в дистре не вижу. + Новички как видно путаются...
    И давай решим уже с автолинковкой libtcc1.a(да я дурачёк эта либа именно так называется а не libtcc.a), lc.def и crt0.asm. Опять же автосборке ничего не будет.
    __
    Я думаю этого будет достаточно или не? Помню ты говорил пока не сделаем __attribute__((dllimport)) добавлять не будем почему то. Или я что то путаю.

    Code: Select all

    tcc_add_crt(s,"crt0.o");
    tcc_add_library_err(s, "c");
    tcc_add_library_err(s, "tcc1");
    
    Attachments
    tcc.zip (379.07 KiB)
    Downloaded 108 times
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Кста самое главное! Разработка tcc достаточно живая по этому я наверное попрошу чтобы Xvilka починил gcc на серваке. Каждый раз просить обновлять tcc как то не камельфо.
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Привет!
    сделать формат KX дефолтным для tcc в самом дистре?
    Я в целом согласен, но это еще большая работа, т.к. нужно править все оставшиеся заголовки, например, mbedtls, т.к. сейчас вызов внешних функций из библиотек происходит по указателю. Но учитывая, что я планирую сделать, чтобы вызовы были как функции (с помощью __attribute__((dllimport))), то сейчас это будет двойная работа. По этой же причине mbedtls.def предлагаю пока убрать.
    Смысла два способа сборки держать в дистре не вижу. + Новички как видно путаются
    Тут тоже согласен. Тем более что старый способ ненадежный.
    давай решим уже с автолинковкой libtcc1.a, ... lc.def и crt0.asm
    Ок, добавлю, только надо будет поправить еще все скрипты сборки (чтобы эти библиотеки не фигурировали дважды). А почему название название libtcc не можем оставить, зачем еще 1 в конце?libc.def я так понял тоже меняем на lc.def?
    автособираемые проги не пострадают
    Тут не уверен, нужно внести все изменения сразу - это большая работа. Самое главное, чтобы автосборка не встала. Поэтому и предлагаю делать все поэтапно:
    1) Перенастроить дистрибутив c samples, чтобы примеры собирались по-новому. На этом этапе tcc.conf пока останется. Дополнительно временно сделаю, чтобы корневая папка include также автоматом цеплялась (чтобы ее не задавать в скрипте), т.к. корень меняется на %tcc_root%/kx/lib и include ищется там (а на самом деле от в папке %tcc_root%, т.е. на уровень выше). Старая папка lib пока останется. И да, в CLAYER пока надо оставить функции типа kolibri_boxlib_init. Так не будет проблем с автосборкой.
    2) Перенастроить все в приложениях автосборки и залить новый tcc на сервер. Возможно этот этап придется разбивать на подэтапы.
  • Вот патч для tcc. Что тут есть:
    1. Удалён мой костыль undef_sym_flag. (Coldy кажется это пофиксил);
    2. Добавлен автолинк libc.def и libtcc1.a(+ подправлен линк crt0.o);
    3. Если символы из crt0.o ненайдены, вызывает ошибку сборки;
    4. tcc теперь находит crt0.o при использовании параметра -B.
    Attachments
    tcc_source.diff (4.33 KiB)
    Downloaded 101 times
    Изобретайте колёса каждый раз, когда хотите написать новую программу.
  • Два вопроса:
    1. tcc собирает сам себя?
    2. Кодовая база для Колибри и линукс версии для кросскомпиляции одна и таже?
    to infinity and beyond
  • Who is online

    Users browsing this forum: No registered users and 3 guests