LCC

High-level languages programming questions
  • Щас нет компилятора рядом, нельзяли версию с _I_END, чтобы его можно было из c использовать.

    А вообще куль.

    Перспективы портирования Ansi C библиотеки без возможности линковать несколько файлов достаточно сомнительная :)
  • nn2
    Есть хитрый скрипт для ld позволяющий линковать программы в исполняемые файлы meos. С ним даже ничего не нужно делать для портирования компиляторов.
  • Под мингв неработает, линукс могу поднять только дома :)

    В скриптах основная проблема, т.к. я скомпилировал mlibc от ярека, а слинковать с программой не могу :(

    Вобще я нашел решение с чтением от всей памяти - но это оверхеад большой.
    + программы оооочень большие получаются
  • Для MinGW решение есть. Лично компилировал и линковал бинарники через MinGW.

    Вот "хитрый" скрипт:

    Code: Select all

    ENTRY(Start)
    SECTIONS
    {
      .text 0x000000:
       {
        *(.text)
       }
      
      .data : {
        *(.data)
        hEnd = . ;
       }
       
      .bss :
       {
        *(.bss)
       }
       Memory = . ;
    }
    
    Makefile:

    Code: Select all

    OUTFILE = program
    OBJS = asm_code.obj c_code.o
    
    
    .SUFFIXES: .asm .obj
    
    $(OUTFILE) : $(OBJS)
    	ld -nostdlib -T menuet.ld -o $(OUTFILE) $(OBJS)
    	objcopy $(OUTFILE) -O binary
    
    .asm.obj:
    	fasm $*.asm
    
    .c.o:
    	gcc -c $*.c
    
  • Что значит "нельзяли версию с _I_END"? Если имеется ввиду указатель на конец кода, то его можно вычислить.
    Я забыл написать что есть два массива :

    extern unsigned char *memb;
    extern ulong *memd;


    отображаемые на код программы, созданные для реализации malloc.h.
    Таким образом I_END = (void *) memd[4];
  • Я так и пользую, как и написал, но лишние пару байтов :)
    И да, тоже маллок пишу :)

    2Поддубный

    после обжкопи получается файл размером 0 байт
    Можно узнать откуда ты тянул мингв и какая версия?
  • nn2
    Вот для полноты картины остальной код.
    asm_code.asm

    Code: Select all

    format MS COFF
    
    public Start
    extrn Memory
    extrn hEnd
    
    extrn _sum
    
    section ".text" code
      db "MENUET01"
      dd 1, [b]Start[/b], hEnd, Memory, hStack, Param, 0
    
      Start:
         push 21 ; b
         push 79 ; a
         call _sum
         add  esp, 8
    
         or   eax, -1
         int  0x40
    
    section ".bss"
      Param rb 256
    
      rb 4096
      hStack:
    
    c_code.c

    Code: Select all

    int sum(int a, int b)
    {
      return a+b;
    }
    

    MinGW 4.1.1
    -GNU ld version 2.16.91 20050827
    -GNU objcopy 2.16.91 20050827
    -gcc (GCC) 3.4.4 (mingw special)
  • А у меня gcc пишет неподдерживаемый формат для asm_code.obj
  • Для MinGW asm_code должен быть в MS COFF
    Для DJGPP - COFF
    В Линуксе - ELF
  • nn2
    Попробуй добавить ключ -n у ld. У меня компилируется только после этого.
  • diamond
    -n ownage :)

    Работает...
    Пошел пробавать c++ с извратами :)
  • В помощь тем кто смотрит в сторону c++.

    Возникшие у меня проблемы:
    при объявлении в фасме метки memory как public она неправильное значение имеет в c++ программе: решение:
    функция вроде:
    getMemory:
    mov eax,Memory
    ret
    C++ изрядно искажает имена, поэтому для вызова main() можно
    использовать такую страшную конструкцию :):
    extern void meMain() asm("meMain");
    void meMain(){
    //<реализация>
    }
    Соответственно вместо meMain в asm("meMain") можно выбрать любое имя какое вам подуше, :) и именно этим идентификатором пользоваться в ассемблерном старт-ап коде.

    Сисфункции я реализовываю с помошью инлайн ассемблера, например так:
    void meos_debug_print(const char* data){
    do{
    asm volatile ("movl $63,%%eax\n\
    movl $1,%%ebx\n\
    movb %0,%%cl\n\
    int $0x40\
    "::"rig"(*data):"eax","ebx","ecx");
    }while(*(data++));
    }
    Вам придется перегрузить глобальные операторы new,delete(ну и их вариации) и написать собственные функции malloc free (когда мой вариант будет не так страшен, выложу, вместе с SIKWL`ом для с++).

    Для Виртуальных ф-й в линкер скрипт следует включить запись секции .rdata*:
    ENTRY(Start)
    SECTIONS
    {
    // cut
    .data : {
    *(.data)
    }
    .rdata:{
    *(.rdata*)
    }
    //cut
    }
    rtti и исключения не доступны следовательно компилятору следует передать параметры -fno-rtti -fno-exceptions. На некоторых сборках может потребоваться -fno-check-new (непроверять что new возвратил не 0).
    Да, все выше перечисленное компилер специфик для gcc3.*?

    В процессе написания рантайм библиотека для поддержки исключений в моей сборке g++ используются ф-ии аля unwind_sjlj_register.
    После релиза рантайм библиотеки будет зарелизен сиквел (мож даже чуть раньше, и потом версия с исключениями :))[/quote]
  • Who is online

    Users browsing this forum: No registered users and 5 guests