Изменил lcc, что бы он выдавал код для MeOS, правда работает пока из под Win, но для полного портирования нужно писать библиотеку ANSI C.
Брать тут : http://iam.gorodok.net/lcc41.zip, описание внутри.
LCC
Щас нет компилятора рядом, нельзяли версию с _I_END, чтобы его можно было из c использовать.
А вообще куль.
Перспективы портирования Ansi C библиотеки без возможности линковать несколько файлов достаточно сомнительная
А вообще куль.
Перспективы портирования Ansi C библиотеки без возможности линковать несколько файлов достаточно сомнительная
nn2
Есть хитрый скрипт для ld позволяющий линковать программы в исполняемые файлы meos. С ним даже ничего не нужно делать для портирования компиляторов.
Есть хитрый скрипт для ld позволяющий линковать программы в исполняемые файлы meos. С ним даже ничего не нужно делать для портирования компиляторов.
Под мингв неработает, линукс могу поднять только дома
В скриптах основная проблема, т.к. я скомпилировал mlibc от ярека, а слинковать с программой не могу
Вобще я нашел решение с чтением от всей памяти - но это оверхеад большой.
+ программы оооочень большие получаются
В скриптах основная проблема, т.к. я скомпилировал mlibc от ярека, а слинковать с программой не могу
Вобще я нашел решение с чтением от всей памяти - но это оверхеад большой.
+ программы оооочень большие получаются
Для MinGW решение есть. Лично компилировал и линковал бинарники через MinGW.
Вот "хитрый" скрипт:
Makefile:
Вот "хитрый" скрипт:
Code: Select all
ENTRY(Start)
SECTIONS
{
.text 0x000000:
{
*(.text)
}
.data : {
*(.data)
hEnd = . ;
}
.bss :
{
*(.bss)
}
Memory = . ;
}
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];
Я забыл написать что есть два массива :
extern unsigned char *memb;
extern ulong *memd;
отображаемые на код программы, созданные для реализации malloc.h.
Таким образом I_END = (void *) memd[4];
Я так и пользую, как и написал, но лишние пару байтов
И да, тоже маллок пишу
2Поддубный
после обжкопи получается файл размером 0 байт
Можно узнать откуда ты тянул мингв и какая версия?
И да, тоже маллок пишу
2Поддубный
после обжкопи получается файл размером 0 байт
Можно узнать откуда ты тянул мингв и какая версия?
nn2
Вот для полноты картины остальной код.
asm_code.asm
c_code.c
MinGW 4.1.1
-GNU ld version 2.16.91 20050827
-GNU objcopy 2.16.91 20050827
-gcc (GCC) 3.4.4 (mingw special)
Вот для полноты картины остальной код.
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:
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
Для DJGPP - COFF
В Линуксе - ELF
nn2
Попробуй добавить ключ -n у ld. У меня компилируется только после этого.
Попробуй добавить ключ -n у ld. У меня компилируется только после этого.
diamond
-n ownage
Работает...
Пошел пробавать c++ с извратами
-n ownage
Работает...
Пошел пробавать c++ с извратами
В помощь тем кто смотрит в сторону c++.
Возникшие у меня проблемы:
при объявлении в фасме метки memory как public она неправильное значение имеет в c++ программе: решение:
функция вроде:
использовать такую страшную конструкцию :
Сисфункции я реализовываю с помошью инлайн ассемблера, например так:
Для Виртуальных ф-й в линкер скрипт следует включить запись секции .rdata*:
Да, все выше перечисленное компилер специфик для gcc3.*?
В процессе написания рантайм библиотека для поддержки исключений в моей сборке g++ используются ф-ии аля unwind_sjlj_register.
После релиза рантайм библиотеки будет зарелизен сиквел (мож даже чуть раньше, и потом версия с исключениями )[/quote]
Возникшие у меня проблемы:
при объявлении в фасме метки memory как public она неправильное значение имеет в c++ программе: решение:
функция вроде:
C++ изрядно искажает имена, поэтому для вызова main() можноgetMemory:
mov eax,Memory
ret
использовать такую страшную конструкцию :
Соответственно вместо meMain в asm("meMain") можно выбрать любое имя какое вам подуше, и именно этим идентификатором пользоваться в ассемблерном старт-ап коде.extern void meMain() asm("meMain");
void meMain(){
//<реализация>
}
Сисфункции я реализовываю с помошью инлайн ассемблера, например так:
Вам придется перегрузить глобальные операторы new,delete(ну и их вариации) и написать собственные функции malloc free (когда мой вариант будет не так страшен, выложу, вместе с SIKWL`ом для с++).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++));
}
Для Виртуальных ф-й в линкер скрипт следует включить запись секции .rdata*:
rtti и исключения не доступны следовательно компилятору следует передать параметры -fno-rtti -fno-exceptions. На некоторых сборках может потребоваться -fno-check-new (непроверять что new возвратил не 0).ENTRY(Start)
SECTIONS
{
// cut
.data : {
*(.data)
}
.rdata:{
*(.rdata*)
}
//cut
}
Да, все выше перечисленное компилер специфик для gcc3.*?
В процессе написания рантайм библиотека для поддержки исключений в моей сборке g++ используются ф-ии аля unwind_sjlj_register.
После релиза рантайм библиотеки будет зарелизен сиквел (мож даже чуть раньше, и потом версия с исключениями )[/quote]
Who is online
Users browsing this forum: No registered users and 1 guest