C-- Sphinx Compiler

...
  • Проверил, строка "/sys/lib/../calc" запускает calc.

    Вот это viewtopic.php?f=31&t=659&p=67590#p67589 правилось или нет?
    Из хаоса в космос
  • Должно, теперь это делается до файловых систем.
  • При сборке некоторых программ(например, Eolite) падает с General protection fault.
    Может быть, попробовать стек побольше сделать?
    Или может какая-то функция в libc недоработана?

    Забавный факт, для сборки под винду достаточно bat-ника, содержащего только одну строку:

    Code: Select all

    gcc -fno-exceptions -D_WIN32_ -D__CONSOLE__ -o cmm.exe *.cpp
    Сравните с содержимым Makefile
    Spoiler:

    Code: Select all

    Compiler                = gcc
    
    #Compiler_Options       = -c -fno-exceptions -D_UNIX_
    Compiler_Options       = -c -fno-exceptions -D_WIN32_ -D__CONSOLE__
    
    #-D: _WIN32_ or _UNIX_
    #-D: for _WIN32_ add -D__CONSOLE__
    
    Exe_file                = cmm
    
    All_Libs	 	= main.o toka.o tokb.o tokc.o toke.o tokr.o errors.o debug.o outobj.o outpe.o disasm.o switch.o outle.o pointer.o new_type.o class.o res.o optreg.o libobj.o port.o
    
    ####################
    ## Makefile rules ##
    ####################
    
    all        : $(Exe_file)
    
    $(Exe_file) : $(All_Libs)
    	$(Compiler)  -o $(Exe_file) $(All_Libs)
    clean:
    	rm *.o
    
    
    # next are the exceptions that don't have to be compiled with the /zu option
    # since they will never be called from a interrupt. hey.. I _tried_ to find
    # a clean solution..
    
    main.o :  main.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    toka.o :  toka.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    tokb.o :  tokb.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    tokc.o :  tokc.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    toke.o :  toke.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    tokr.o :  tokr.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    errors.o :errors.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    debug.o : debug.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    outobj.o : outobj.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    outpe.o : outpe.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    disasm.o : disasm.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    switch.o : switch.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    outle.o : outle.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    pointer.o : pointer.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    new_type.o : new_type.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    class.o : class.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    res.o : res.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    optreg.o : optreg.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    libobj.o : libobj.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    port.o: port.cpp
    	$(Compiler) $(Compiler_Options) $<
    
    .cpp.o:
    	$(Compiler) $(Compiler_Options) $<
    
    .asm.o:
    	fasm $<
    
  • 0CodErr
    Невероятно, работает (залил на SVN).
    Может быть еще есть скрипт для компиляции Колибри бинарника из-под Windows?
    Из хаоса в космос
  • Пытался собрать для Ubuntu 16.04. В итоге кое-как собрал, компилятор CMM работает не стабильно, легкие примеры компилирует, но бинарник не запускается к колибриос. Может кто нибудь сможет довести его до конца.
    cmm.tar.gz (925.99 KiB)
    Downloaded 316 times
    Spoiler:
    Снимок экрана от 2018-11-04 20-22-37.png
    Снимок экрана от 2018-11-04 20-22-37.png (315.71 KiB)
    Viewed 11794 times
    Технологии меняют мир, а я - меняю технологии.
  • Тоже пытался собрать под Убунтой, и тоже неудачно. 64-битная версия компилирует нечто левое. 32-битная версия вроде работает, простые примеры тоже вроде запускаются в Колибри (в моём случае в эмуляторе kex). Но на более сложных проектах (к примеру Eolite) cmm вылетает в sigsegv. Те же самые исходники компилируются виндовой версией под wine без проблем. Печалька.
  • Довел компилятор для Ubuntu 16.04 x64 до корректной компиляции бинарников для KolibriOS. Но остался один баг, при компиляции тяжелых программ (например Eolite) - крэшиться.
    Перед компиляцией исходников прикрепленных в этом сообщении не забудьте установить.

    Code: Select all

    sudo apt-get install gcc-multilib
    Технологии меняют мир, а я - меняю технологии.
  • Для Ubuntu. Более новее версия компилятора взятого с SVN, еще крэшится
    Attachments
    cmm.r7531.tar.gz (564.6 KiB)
    Downloaded 259 times
    Технологии меняют мир, а я - меняю технологии.
  • pavelyakov
    Можешь собрать нормальный компилятор под Колибри?
    Тот что есть, ничерта не компилит из-за проблем с путями.
    Attachments
    SCREEN_2.PNG
    SCREEN_2.PNG (106.81 KiB)
    Viewed 10277 times
    Из хаоса в космос
  • 0CodErr wrote:Забавный факт, для сборки под винду достаточно bat-ника, содержащего только одну строку:

    Code: Select all

    gcc -fno-exceptions -D_WIN32_ -D__CONSOLE__ -o cmm.exe *.cpp
    а не надо добавить -D_WС_ ?
    Проверьте на компиляции конструкций типа (E)AX, (E)BX и т.п.
  • Дебагер показывает, где в стеке вызовов произошла ошибка сигментации, но я так её и не нашел.
    (gdb) backtrace
    #0 0xf7e4ad7b in malloc () from /lib/i386-linux-gnu/libc.so.6
    #1 0x5655af74 in MALLOC(int) ()
    #2 0x565b6020 in BackString(char*) ()
    #3 0x5655f7f6 in CheckMassiv(char*&, int, int, int*, int*, long*) ()
    #4 0x5655ef0b in CheckAllMassiv(char*&, int, _SINFO_*, _ITOK_*, int, int) ()
    #5 0x5657a98e in getinto_e_ax(int, int, _ITOK_*, char*&, _SINFO_*, int, int)
    ()
    #6 0x5657bd14 in do_e_axmath(int, int, char**) ()
    #7 0x565a0173 in constructcompare(int, unsigned int, LVIC*) ()
    #8 0x565a0e5f in compare(int, unsigned int*, REGISTERSTAT**, REGISTERSTAT**, LVIC*) ()
    #9 0x565a5639 in dofor(unsigned int) ()
    #10 0x5659951d in docommand() ()
    #11 0x565990d7 in doblock2() ()
    #12 0x5659909e in doblock() ()
    #13 0x565a58e0 in dofor(unsigned int) ()
    #14 0x5659951d in docommand() ()
    #15 0x565990d7 in doblock2() ()
    #16 0x565a9239 in setproc(int) ()
    #17 0x565b2dc1 in insert_dynamic(int) ()
    #18 0x56564ad3 in docalls() ()
    #19 0x56558ab0 in compile() ()
    #20 0x565587ec in main ()
    Технологии меняют мир, а я - меняю технологии.
  • посмотри параметр - размер, с которым вызван malloc

    и количество выделенной памяти на тот момент процессу
  • revision #7545

    Кажется я нашёл, почему под линуксом cmm вылетал. Автор явно рассчитывал на то, что память, выделяемая malloc, содержит нули. Под виндой это почти так (первые байты всё равно не нулевые), а в убунте нет. К тому-же, под виндой, free обычно весьма толерантно относится к левому указателю, а линукс безжалостно генерирует сигнал, после чего программа завершается.

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

    Кроме того я внёс исправление обратных слешей на прямые, это должно и для Колибри подойти.
  • tsdima wrote:revision #7545

    Кажется я нашёл, почему под линуксом cmm вылетал. Автор явно рассчитывал на то, что память, выделяемая malloc, содержит нули. Под виндой это почти так (первые байты всё равно не нулевые), а в убунте нет. К тому-же, под виндой, free обычно весьма толерантно относится к левому указателю, а линукс безжалостно генерирует сигнал, после чего программа завершается.
    ...
    По обоим вопросам нет. Покажи где такое используется

    Какая то заморочка в websvn diff, не могу посмотреть все исправления (
  • Who is online

    Users browsing this forum: No registered users and 1 guest