Работаю с gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3 и GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303.
libc уже не помню какой именно у меня, но кажется, новее, чем libc от Ярека (мне почему-то кажется, что используется 70я функция, а не 58я для работы с ФС), хотя и основан кажется на нем. Где исходный архив - не знаю, но похоже с сайта
diamond'а Собрался libc без проблем (почти) - задал export MENUETDEV, зашел в папку, ввел make, подождал и получил скомпилированный binclock и еще пару простых программ. Остальные не компилировались, выдавая ошибки о нехватке библиотек или ругались на undefined __stack_chk_fail. После того, как я добавил void __stack_chk_fail(void) {} в некомпилирующиеся программы и скомпилировал библиотеки, которых не хватало (взял исходники с menuetcd), все остальное тоже заработало. Полный "проект" интерпретатора bf состоит из файла main.c и makefile
Code:
OUTFILE = bf
OBJS = main.o
LIBS = -lcon2
include $(MENUETDEV)/makefiles/Makefile_for_program
Если же говорить о попытках использования console.c: я взял console.c из shell 0.4.1, добавил в него функции из kolibri.c, на которые компилятор ругался "undefined refernce", и теперь получаю
Code:
/home/sourcerer/projects/me/linuxtools/mgcc test.c test.o -fno-stack-protector
In file included from test.c:6:
/home/sourcerer/projects/me/include/console.c:16: error: expected ‘)’ before ‘con_init’
/home/sourcerer/projects/me/include/console.c:17: error: expected ‘)’ before ‘printf’
/home/sourcerer/projects/me/include/console.c:18: error: expected ‘)’ before ‘_exit’
/home/sourcerer/projects/me/include/console.c:19: error: expected ‘)’ before ‘gets’
/home/sourcerer/projects/me/include/console.c:20: error: expected ‘)’ before ‘getch’
/home/sourcerer/projects/me/include/console.c:21: error: expected ‘)’ before ‘con_get_font_height’
/home/sourcerer/projects/me/include/console.c:22: error: expected ‘)’ before ‘con_set_cursor_height’
/home/sourcerer/projects/me/include/console.c:23: error: expected ‘)’ before ‘con_get_flags’
/home/sourcerer/projects/me/include/console.c:24: error: expected ‘)’ before ‘con_set_flags’
/home/sourcerer/projects/me/include/console.c:25: error: expected ‘)’ before ‘con_cls’
/home/sourcerer/projects/me/include/console.c:34: warning: ‘packed’ attribute ignored for field of type ‘char’
/home/sourcerer/projects/me/include/console.c:36: warning: ‘packed’ attribute ignored
/home/sourcerer/projects/me/include/console.c:42: warning: ‘packed’ attribute ignored
/home/sourcerer/projects/me/include/console.c: In function ‘CONSOLE_INIT’:
/home/sourcerer/projects/me/include/console.c:86: error: ‘con_init’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:86: error: (Each undeclared identifier is reported only once
/home/sourcerer/projects/me/include/console.c:86: error: for each function it appears in.)
/home/sourcerer/projects/me/include/console.c:86: error: ‘_stdcall’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:86: error: expected ‘)’ before ‘void’
/home/sourcerer/projects/me/include/console.c:87: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:91: error: ‘_cdecl’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:91: error: expected ‘)’ before ‘void’
/home/sourcerer/projects/me/include/console.c:92: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:96: error: ‘_exit’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:96: error: expected ‘)’ before ‘void’
/home/sourcerer/projects/me/include/console.c:97: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:101: error: expected ‘)’ before ‘void’
/home/sourcerer/projects/me/include/console.c:102: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:106: error: ‘getch’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:106: error: expected ‘)’ before ‘int’
/home/sourcerer/projects/me/include/console.c:107: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:111: error: ‘con_get_font_height’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:111: error: expected ‘)’ before ‘int’
/home/sourcerer/projects/me/include/console.c:112: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:116: error: ‘con_set_cursor_height’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:116: error: expected ‘)’ before ‘int’
/home/sourcerer/projects/me/include/console.c:117: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:121: error: ‘con_get_flags’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:121: error: expected ‘)’ before ‘unsigned’
/home/sourcerer/projects/me/include/console.c:122: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:126: error: ‘con_set_flags’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:126: error: expected ‘)’ before ‘unsigned’
/home/sourcerer/projects/me/include/console.c:127: error: expected ‘;’ before ‘kol_cofflib_procload’
/home/sourcerer/projects/me/include/console.c:131: error: ‘con_cls’ undeclared (first use in this function)
/home/sourcerer/projects/me/include/console.c:131: error: expected ‘)’ before ‘void’
/home/sourcerer/projects/me/include/console.c:132: error: expected ‘;’ before ‘kol_cofflib_procload’
make: *** [test.o] Ошибка 1
Начиная с 16й строки:
Code:
void (* _stdcall con_init)(unsigned w_w, unsigned w_h, unsigned s_w, unsigned s_h, const char* t);
void (* _cdecl printf)(const char* format,...);
void (* _stdcall _exit)(char bCloseWindow);
void (* __stdcall gets)(char* str, int n);
int (* __stdcall getch)(void);
int (* __stdcall con_get_font_height)(void);
int (* __stdcall con_set_cursor_height)(int new_height);
unsigned (*__stdcall con_get_flags)(void);
unsigned (*__stdcall con_set_flags)(unsigned new_flags);
void (*__stdcall con_cls)(void);
Кажется, проблема в переопределении функций stdio. Верно? Очень хочется сохранить совместимость со стандартом ANSI по максимуму.. В идеале чтобы работали команды из libc, которые там есть, но еще можно было подключить console.c к исходным кодам, и использовать если не printf, то хотя бы какие-нибудь krpintf и kgetch.