Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Apr 04, 2020 9:54 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 13 posts ] 
Author Message
 Post subject: LCC
PostPosted: Sat Jun 17, 2006 8:58 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Mar 20, 2006 10:44 am
Posts: 557
Изменил lcc, что бы он выдавал код для MeOS, правда работает пока из под Win, но для полного портирования нужно писать библиотеку ANSI C.
Брать тут : http://iam.gorodok.net/lcc41.zip, описание внутри.


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

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

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


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


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

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

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


Top
   
 Post subject:
PostPosted: Mon Jun 19, 2006 1:15 pm 
Offline

Joined: Fri Nov 12, 2004 3:20 pm
Posts: 90
Для MinGW решение есть. Лично компилировал и линковал бинарники через MinGW.

Вот "хитрый" скрипт:
Code:
ENTRY(Start)
SECTIONS
{
  .text 0x000000:
   {
    *(.text)
   }
 
  .data : {
    *(.data)
    hEnd = . ;
   }
   
  .bss :
   {
    *(.bss)
   }
   Memory = . ;
}


Makefile:
Code:
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


Top
   
 Post subject:
PostPosted: Mon Jun 19, 2006 2:06 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Mar 20, 2006 10:44 am
Posts: 557
Что значит "нельзяли версию с _I_END"? Если имеется ввиду указатель на конец кода, то его можно вычислить.
Я забыл написать что есть два массива :

extern unsigned char *memb;
extern ulong *memd;


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


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

2Поддубный

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


Top
   
 Post subject:
PostPosted: Mon Jun 19, 2006 6:27 pm 
Offline

Joined: Fri Nov 12, 2004 3:20 pm
Posts: 90
nn2
Вот для полноты картины остальной код.
asm_code.asm
Code:
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:
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)


Top
   
 Post subject:
PostPosted: Tue Jun 20, 2006 6:47 am 
Offline

Joined: Mon Apr 10, 2006 7:22 am
Posts: 76
А у меня gcc пишет неподдерживаемый формат для asm_code.obj


Top
   
 Post subject:
PostPosted: Tue Jun 20, 2006 1:42 pm 
Offline

Joined: Fri Nov 12, 2004 3:20 pm
Posts: 90
Для MinGW asm_code должен быть в MS COFF
Для DJGPP - COFF
В Линуксе - ELF


Top
   
 Post subject:
PostPosted: Tue Jun 20, 2006 3:23 pm 
Offline
Kernel Developer
User avatar

Joined: Mon Nov 28, 2005 8:00 pm
Posts: 1601
nn2
Попробуй добавить ключ -n у ld. У меня компилируется только после этого.


Top
   
 Post subject:
PostPosted: Tue Jun 20, 2006 7:06 pm 
diamond
-n ownage :)

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


Top
   
 Post subject:
PostPosted: Sun Jul 09, 2006 6:14 pm 
В помощь тем кто смотрит в сторону c++.

Возникшие у меня проблемы:
при объявлении в фасме метки memory как public она неправильное значение имеет в c++ программе: решение:
функция вроде:

Quote:
getMemory:
mov eax,Memory
ret


C++ изрядно искажает имена, поэтому для вызова main() можно
использовать такую страшную конструкцию :):

Quote:
extern void meMain() asm("meMain");
void meMain(){
//<реализация>
}

Соответственно вместо meMain в asm("meMain") можно выбрать любое имя какое вам подуше, :) и именно этим идентификатором пользоваться в ассемблерном старт-ап коде.

Сисфункции я реализовываю с помошью инлайн ассемблера, например так:
Quote:
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*:

Quote:
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]


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 13 posts ] 

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited