Page 1 of 1

LCC

Posted: Sat Jun 17, 2006 8:58 pm
by Ghost
Изменил lcc, что бы он выдавал код для MeOS, правда работает пока из под Win, но для полного портирования нужно писать библиотеку ANSI C.
Брать тут : http://iam.gorodok.net/lcc41.zip, описание внутри.

Posted: Sun Jun 18, 2006 3:54 pm
by nn2
Щас нет компилятора рядом, нельзяли версию с _I_END, чтобы его можно было из c использовать.

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

Перспективы портирования Ansi C библиотеки без возможности линковать несколько файлов достаточно сомнительная :)

Posted: Mon Jun 19, 2006 6:13 am
by halyavin
nn2
Есть хитрый скрипт для ld позволяющий линковать программы в исполняемые файлы meos. С ним даже ничего не нужно делать для портирования компиляторов.

Posted: Mon Jun 19, 2006 1:05 pm
by nn2
Под мингв неработает, линукс могу поднять только дома :)

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

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

Posted: Mon Jun 19, 2006 1:15 pm
by Иван Поддубный
Для 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

Posted: Mon Jun 19, 2006 2:06 pm
by Ghost
Что значит "нельзяли версию с _I_END"? Если имеется ввиду указатель на конец кода, то его можно вычислить.
Я забыл написать что есть два массива :

extern unsigned char *memb;
extern ulong *memd;


отображаемые на код программы, созданные для реализации malloc.h.
Таким образом I_END = (void *) memd[4];

Posted: Mon Jun 19, 2006 2:36 pm
by nn2
Я так и пользую, как и написал, но лишние пару байтов :)
И да, тоже маллок пишу :)

2Поддубный

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

Posted: Mon Jun 19, 2006 6:27 pm
by Иван Поддубный
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)

Posted: Tue Jun 20, 2006 6:47 am
by O01eg
А у меня gcc пишет неподдерживаемый формат для asm_code.obj

Posted: Tue Jun 20, 2006 1:42 pm
by Иван Поддубный
Для MinGW asm_code должен быть в MS COFF
Для DJGPP - COFF
В Линуксе - ELF

Posted: Tue Jun 20, 2006 3:23 pm
by diamond
nn2
Попробуй добавить ключ -n у ld. У меня компилируется только после этого.

Posted: Tue Jun 20, 2006 7:06 pm
by nn2
diamond
-n ownage :)

Работает...
Пошел пробавать c++ с извратами :)

Posted: Sun Jul 09, 2006 6:14 pm
by nn2
В помощь тем кто смотрит в сторону 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]