Page 1 of 1

GCC console hello world

Posted: Sat Jun 27, 2015 11:46 pm
by DeXP
Пытаюсь скросскомпилировать простейший Hello world под KolibriOS. Бинарник даже получается, kpack его жмёт. Вариант номер раз:

Code: Select all

#include <stdio.h>
int main(){
	printf("Hell %d word!\n", 66);
    return 0;
}
Вариант номер два:
Spoiler:

Code: Select all

#include <string.h>

void (* _cdecl con_printf)(const char* format,...);
void (* _stdcall con_init)(unsigned w_w, unsigned w_h, unsigned s_w, unsigned s_h, const char* t);

#pragma pack(push,1)
typedef struct{
	char *name;
	void *data;
} kol_struct_import;
#pragma pack(pop)

void kol_exit(){
	asm ("int $0x40"::"a"(-1));
}

kol_struct_import* kol_cofflib_load(char *name){
	asm volatile ("int $0x40"::"a"(68), "b"(19), "c"(name));
}

void* kol_cofflib_procload(kol_struct_import *imp, char *name){
	int i;
	for (i=0;;i++)
		if ( NULL == ((imp+i) -> name))
			break;
		else
			if ( 0 == strcmp(name, (imp+i)->name) )
				return (imp+i)->data;
	return NULL;
}

int init_console(char* title){
	kol_struct_import *imp;

	imp = kol_cofflib_load("/sys/lib/console.obj");
	if( imp == NULL ) kol_exit();

	con_init = ( _stdcall  void (*)(unsigned, unsigned, unsigned, unsigned, const char*))
                kol_cofflib_procload (imp, "con_init");
	if( con_init == NULL ) kol_exit();

	con_printf = ( _cdecl void (*)(const char*,...))
                kol_cofflib_procload (imp, "con_printf");
	if( con_printf == NULL ) kol_exit();
	con_init(-1, -1, -1, -1, title);
	con_printf("Console inited!\n");
	return 0;
}

int main()
{
    init_console("hellWord!");
    con_printf("Hell %d word!\n", 66);
    return 0;
}
Лог сборки:

Code: Select all

kos32-gcc.exe -Wall -O2 -I"C:\Program Files (x86)\CodeBlocks\KolibriOS\include" -c E:\work\hellWord\main.c -o obj\kolibr\main.o
kos32-ld.exe -L"C:\Program Files (x86)\CodeBlocks\KolibriOS\libc" -o bin\kolibri\hellWord.kex obj\kolibr\main.o  -s -static -nostdlib -S -Te:\Install\newlib.r5571\app.lds  -lgcc -lapp -lc.dll
kos32-objcopy.exe bin\kolibri\hellWord.kex -O binary
При двойном клике по бинарнику в Eolite ничего не происходит. При запуске оттуда же через Shell получаю что-то типа:

Code: Select all

'/usbhd0/1/Kolibri/hellword.kex' запущен. PID = 51.
Попытался отдать оба бинарника в MTDBG. Загружаются через load корректно, после нажатия "g" пишет одну и ту же ошибку:

Code: Select all

Debugged program caused an exception 0E. (Page fault)
Suspended
Что нужно исправить, что бы Hello world заработал?

Re: GCC console hello world

Posted: Mon Oct 05, 2015 8:36 pm
by paulcodeman
Явно ошибка в компиляции, исполняемый файл некорректный, возможно из-за настройки компилятора.

Re: GCC console hello world

Posted: Thu Sep 17, 2020 12:09 pm
by maxcodehack