Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 9781 → Rev 9782

/programs/develop/ktcc/trunk/bin/doc/ru/Features.txt
1,5 → 1,5
 
Версия расширения KX - 0.4.3
Версия расширения KX - 0.4.6
 
Обзор новых возможностей
 
19,9 → 19,10
+ Уменьшенный размер образа
Поскольку загрузчик библиотек больше не нужно размещать в каждом
приложении, это уменьшает размер образа. Больше не нужен слой C
(C layer), все зависимые библиотеки загружаются, а также инициализируются
автоматически. Также используется компактный формат таблицы импорта.
приложении, это уменьшает размер образа. Больше не нужна фукнция вызова
инициализации библиотек в C layer, все зависимые библиотеки загружаются,
а также инициализируются автоматически. Кроме того используется компактные
формат таблицы импорта, а также вызовы функций из динамических библиотек.
+ Обратная совместимость
Если Вы по каким то причинам не хотите, либо пока не готовы использовать
/programs/develop/ktcc/trunk/bin/doc/ru/History.txt
1,4 → 1,17
0.4.6
+ Äîáàâëåíà ïîääåðæêà __attribute__((dllimport))
Íîâûé ñïîñîá âûçîâà èìïîðòîâ äîïîëíèòåëüíî óìåíüøàåò ðàçìåð ïðèëîæåíèé
+ Äîáàâëåíà îáðàáîòêà îøèáîê ëèíêåðà ïðè íåïðàâèëüíîì èñïîëüçîâàíèè òèïîâ
âûçîâîâ ôóíêöèé èìïîðòà, â òîì ÷èñëå äëÿ ñòîðîííèõ îáúåêòíûõ ôàéëîâ
 ÷àñòíîñòè, âûçîâ áåç ïðåôèêñà __attribute__((dllimport)) ïåðåä
èìïîðòèðóåìîé ôóíêöèåé â ôàéëå çàãîëîâêà âûçûâàåò îñòàíîâ ëèíêåðà
+ Äîáàâëåíî îòîáðàæåíèå èíôîðìàöèè î íîìåðå âåðñèè ðàñøèðåíèÿ KX (îïöèÿ -vv)
 
0.4.5
+ Äîáàâëåíî ïîäêëþ÷åíèå %ktcc_root%/include ÷åðåç ôàéë tcc.conf
+
+
 
0.4.4
+ Èñïðàâëåíà îøèáêà ïðè çàäàíèè íåèñïîëüçóåìûõ áèáëèîòåê
+ Óëó÷øåí àëãîðèòì âûðàâíèâàíèÿ ïîñëå ñòðîê áèáëèîòåê è ñèìâîëîâ, ýòî
/programs/develop/ktcc/trunk/bin/doc/ru/How to use.txt
1,16 → 1,29
 
Áûñòðûé ñòàðò
Äëÿ èñïîëüçîâàíèÿ íîâûõ âîçìîæíîñòåé ïðåäîñòàâëÿåìûõ ðàñøèðåíèåì KX
íåîáõîäèìî èñïîëüçîâàòü ôàéë êîíôèãóðàöèè tcc.conf â ïàïêå ãäå ðàñïîëîæåí tcc
Ýòîò ôàéë ïåðåíàñòðàèâàåò äèðåêòîðèþ %ktcc_root%\ íà %ktcc_root%\kx.
tcc èñïîëüçóåòñÿ êàê îáû÷íî (ñì. ñïðàâêó tcc). Ðàñøèðåíèå KX èñïîëüçîëüçóåò
ôàéëû îïðåäåëåíèé ñèìâîëîâ (*.def) äëÿ äèíàìè÷åñêèõ áèáëèîòåê (ôàéëû *.o,
íå òðåáóþòñÿ, èñêëþ÷åíèå - ñòàòè÷åñêèå *.o, åñëè îíè íóæíû äëÿ ðàáîòû
ïðîãðàììû).
 äàííîé äèðåêòîðèè ïðèñóòñòâóåò ïàïêà lib ñ ôàéëàìè
*.def, crt.0 è libtcc.a
Ïðèìåðû ïî ñáîðêå ñì. â äèðåêòîðèè /samples
Ïðèìå÷àíèå:
êëþ÷ -nobss áûë óäàëåí, òàê êàê îí íå èìååò ñìûñëà (ðàíåå ãåíåðèðîâàâøàÿñÿ
bss ñåêöèÿ çàïîëíÿëàñü íóëÿìè è çàíèìàëà íåíóæíîå ìåñòî â ôàéëå, ýòà ñåêöèÿ
íå äîëæíà ñîäåðæàòüñÿ â îáðàçå è ÿäðî èíèöèàëèçèðóåò ýòó ÷àñòü íÿëÿìè
àâòîìàòè÷åñêè ïðè çàãðóçêå)
 äèðåêòîðèè /lib ïîñòàâëÿþòñÿ ôàéëû *.def (îïðåäåëåíèå ñèìâîëîâ äèíàìè÷åñêèõ
áèáëèîòåê), crt0.o (ïîääåðæêà êîäà Ñ) è *libtcc.a (âñïîìîãàòåëüíàÿ áèáëèîòåêà
tcc), à òàêæå íåêîòîðûå ñòàòè÷åñêèå áèáëèîòåêè *.a. Êðîìå òîãî, èìååòñÿ
áèáëèîòåêà tiny.o äëÿ âîçìîæíîñòè ëèíêîâêè ïðèëîæåíèé áåç ïîääåðæêè êîäà Ñ,
â òîì ÷èñëå îáúåêòíûõ ôàéëîâ ñîçäàííûå ñòîðîííèìè êîìïèëÿòîðàìè.
Âî èçáåæàíèå êîíôëèêòîâ áèáèëèîòåê ñ èñïîëüçîâàíèåì âîçìîæíîñòåé
ïðåäîñòàâëÿåìûõ ðàñøèðåíèåì KX ðåêîìåíäóåòñÿ èñïîëüçîâàòü òîëüêî îäíó
äèðåêòîðèþ ñ áèáëèîòåêàìè. Åñëè îïðåäåëåíî íåñêîëüêî äèðåêòîðèé áèáëèîòåê,
äèðåêòîðèþ ñ áèáëèîòåêàìè [++, â êîòîðîé íå äîëæíî áûòü âçàèìîèñêëþ÷àþùèõ
áèáëèîòåê]. Åñëè îïðåäåëåíî íåñêîëüêî äèðåêòîðèé áèáëèîòåê,
â êàæäîé èç íèõ íå äîëæíî áûòü êîíôëèêòíûõ áèáëèîòåê. Íàïðèìåð,
ïðè òàêîì ïîäêëþ÷åíèè áèáëèîòåêè
22,14 → 35,8
ðàáîòû ïðèëîæåíèÿ ñ ðàñøèðåíèåì KX âñå äèíàìè÷åñêèå áèáëèîòåêè äîëæíû áûòü
îáðàáîòàíû òîëüêî ñ *.def
 
 îñòàëüíîì tcc èñïîëüçóåòñÿ êàê îáû÷íî (ñì. ñïðàâêó tcc)
Ïðèìå÷àíèå:
êëþ÷ -nobss áûë óäàëåí, òàê êàê îí íå èìååò ñìûñëà (ðàíåå ãåíåðèðîâàâøàÿñÿ
bss ñåêöèÿ çàïîëíÿëàñü íóëÿìè è çàíèìàëà íåíóæíîå ìåñòî â ôàéëå, ýòà ñåêöèÿ
íå äîëæíà ñîäåðæàòüñÿ â îáðàçå è ÿäðî èíèöèàëèçèðóåò ýòó ÷àñòü íÿëÿìè
àâòîìàòè÷åñêè ïðè çàãðóçêå)
Ôàéëû îïðåäåëåíèÿ ñèìâîëîâ
 
Ôàéëû îïðåäåëåíèÿ ñèìâîëîâ
Ðàñøèðåíèå KX èñïîëüçóåò ôàéëû îïðåäåëåíèé ñèìâîëîâ (*.def). Ôàéëû *.def
èñïîëüçóþò ïðîñòîé ôîðìàò è ìîãóò ñîçäâàòüñÿ è ðåäàêòèðîâàòüñÿ â ëþáîì
óäîáíîì òåêñòîâîì ðåäàêòîðå. Ñòðóêòóðà ôàéëà *.def îïèñàíà íèæå.
54,12 → 61,37
; âñå îñòàëüíûå ñèìâîëû áèáëèîòåêè
Çàãîëîâî÷íûå ôàéëû äèíàìè÷åñêèõ áèáëèîòåê
Äëÿ èìïîòèðóåìûõ ôóíêöèé ïîääåðæèâàåòñÿ äâà ñïîñîáà èõ îáúÿâëåíèÿ:
- ñ ïðåôèêñîì àòðèáóòà èìïîðòà (ðåêîìåíäóåòñÿ äëÿ íîâûõ áèáèëèîòåê).
Äàííûé ñïîñîá äîïîëíèòåëüíî óìåíüøàåò ðàçìåð ïðèëîæåíèÿ.
__attribute__((dllimport)) void foo(int);
- âíåøíÿÿ ôóíêöèÿ ñ âûçîâîì ïî óêàçàòåëþ (óñòàðåâøèé ñïîñîá, èñïîëüçóåòñÿ
äëÿ ñîâìåñòèìîñòè ñ èìåþùèìèñÿ íà äàííûé ìîìåíò çàãîëîâêàìè)
extern int (*foo)(const char*);
ÂÍÈÌÀÍÈÅ:
îáúÿâëåíèå èìïîðòèðóåìîé ôóíêöèè ñ âûçîâîì ïî óêàçàòåëþ áåç ñïåöèôèêàòîðà
extern ÿâëÿåòñÿ îøèáêîé, êîòîðóþ tcc íå ìîæåò îòñëåäèòü, òàê êàê äàííàÿ
êîíñòðóêöèÿ ÿâëÿåòñÿ ïðàâèëüíîé ñ òî÷êè çðåíèÿ ÿçûêà Ñ
int (*foo)(const char*); => îøèáêà!!!
Îáúÿâëåíèå èìïîðòèðóåìûõ ôóíêöèé áåç __attribute__((dllimport))
íå ïîääåðæèâàåòñÿ è áóäåò ãåíåðèðîâàòü îøèáêó ëèíêåðà
void foo(int); => îøèáêà!!!, îñòàíîâ ëèíêåðà.
Ïðîâåðêà ïîääåðæêè ðàñøèðåíèÿ KX
 
Äëÿ ïðîâåðêè, ÷òî tcc ïîääåðæèâàåò ðàñøèðåíèå KX:
1. â êîìàíäíîé ñòðîêå íàáåðèòå
tcc -v
Ñòðîêà íèæå îçíà÷àåò, ÷òî èìååòñÿ ïîääåðêà ðàñøèðåíèÿ KX
tcc version 0.9.26 (i386 KolibriOS/KX extension)
tcc version 0.9.26 (i386 KolibriOS/KX extension 0.4.6)
2. Â êîäå äëÿ óñëîâíîé êîìïèëÿöèè èñïîëüçóéòå äèðåêòèâû ïðåïðîöåññîðà
ïðîâåðêè ïðåäîïðåäåëåííîãî ìàêðîñà __KX__, íàïðèìåð
74,25 → 106,4
îïðåäåëåí âñåãäà, äàæå åñëè Âû ïî êàêèì òî ïðè÷èíàì íå æåëàåòå
èñïîëüçîâàòü íîâûå ïðåèìóùåñòâà. Ïðè èñïîëüçîâàíèè òåêóùèõ
îñîáåííîñòåé ðàçäåëÿòü êîä îïèñàííûì â ïðèìåðå âûøå ñïîñîáîì â
áîëüøèíñòâå ñëó÷àåâ íå òðåáóåòñÿ.
 
Îáåñïå÷åíèå ñîâìåñòèìîñòè
Åñëè äëÿ îáåñïå÷åíèÿ ñîâìåñòèìîñòè íåîáõîäèìî îòäåëèòü êîä, ÷òîáû åãî ìîæíî
áûëî èñïîëüçîâàòü êàê ñ ðàñøèðåíèåì KX, òàê è áåç íåãî, Âû ìîæåòå îïðåäåëèòü
äîïîëíèòåëüíûé ìàêðîñ è òàêèì îáðàçîì ðàçäåëÿòü êîä íà íóæíûå ó÷àñòêè,
íàïðèìåð. Íàñòîÿòåëüíî ðåêîìåíäóåòñÿ èñïîëüçîâàòü òîëüêî êîä ñ ïîääåðæêîé
ðàñøèðåíèÿ KX.
...
#ifdef _C_LAYER
// Êîä êîòîðûé âûïîëíÿåòñÿ áåç ïîääåðæêè ðàñøèðåíèÿ KX
/ èñïîëüçóþùèé ñòàðûé ìåòîä çàãðóçêè
if(!kolibri_libimg_init()){ // Çàãðóæàåì libimg.obj
notify_show("Libimg.obj not loaded!' -E");
exit(0);
}
#endif
...
áîëüøèíñòâå ñëó÷àåâ íå òðåáóåòñÿ.
/programs/develop/ktcc/trunk/source/i386-gen.c
353,6 → 353,14
static void gcall_or_jmp(int is_jmp)
{
int r;
#ifdef TCC_TARGET_KX
if (vtop->type.t & VT_IMPORT) {
o(0x15ff);
greloc(cur_text_section, vtop->sym, ind, R_386_32);
gen_le32(0);
return;
}
#endif
if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {
/* constant case */
if (vtop->r & VT_SYM) {
/programs/develop/ktcc/trunk/source/libtcc.c
660,7 → 660,11
else
sh_num = section->sh_num;
 
if ((sym->type.t & VT_BTYPE) == VT_FUNC) {
if (((sym->type.t & VT_BTYPE) == VT_FUNC
#ifdef TCC_TARGET_KX
) && ((vtop->type.t & VT_IMPORT) == 0
#endif
)) {
sym_type = STT_FUNC;
} else if ((sym->type.t & VT_BTYPE) == VT_VOID) {
sym_type = STT_NOTYPE;
859,11 → 863,14
PUB_FUNC void tcc_error(const char *fmt, ...)
{
TCCState *s1 = tcc_state;
// { Edit by Coldy
if (fmt) {
va_list ap;
 
va_start(ap, fmt);
error1(s1, 0, fmt, ap);
va_end(ap);
} // }
/* better than nothing: in some cases, we accept to handle errors */
if (s1->error_set_jmp_enabled) {
longjmp(s1->error_jmp_buf, 1);
/programs/develop/ktcc/trunk/source/tcc.c
60,6 → 60,7
" KolibriOS"
#ifdef TCC_TARGET_KX
"/KX extension"
TCC_KX_VERSION_INFO
#endif
#else
" Linux"
/programs/develop/ktcc/trunk/source/tcc.h
1217,6 → 1217,9
#define realloc(p, s) use_tcc_realloc(p, s)
#undef strdup
#define strdup(s) use_tcc_strdup(s)
// { Added by Coldy
#define tcc_abort() tcc_error(0)
// }
PUB_FUNC void tcc_memstats(int bench);
PUB_FUNC void tcc_error_noabort(const char *fmt, ...);
PUB_FUNC NORETURN void tcc_error(const char *fmt, ...);
/programs/develop/ktcc/trunk/source/tccgen.c
6316,7 → 6316,7
 
if (ad.a.weak)
type.t |= VT_WEAK;
#ifdef TCC_TARGET_PE
#if defined(TCC_TARGET_PE) || defined(TCC_TARGET_KX)
if (ad.a.func_import)
type.t |= VT_IMPORT;
if (ad.a.func_export)
/programs/develop/ktcc/trunk/source/tcckx.c
1,7 → 1,7
/*
* TCCKX.C - KolibriOS/KX file output for the TinyC Compiler
*
* Copyright (c) 2021 Coldy
* Copyright (c) 2021-2022 Coldy
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
18,6 → 18,8
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
#define TCC_KX_VERSION_INFO "0.4.6"
 
typedef struct {
char magic[4];
long flags;
67,7 → 69,7
 
if (dynsym_index == 0) {
//if (strcmp(name, __kx_import_table_sym) != 0) {
tcc_error/*_noabort*/("undefined symbol '%s'", name);
tcc_error/*_noabort*/("(kx) undefined symbol '%s'", name);
}
 
// KOS support 32 bit only
315,6 → 317,38
}
}
// This routine is called from build_reloc to check the code for incorrect import calls
void kx_check_import_error(int reloc_type, const char* code_base, Elf32_Addr offset, const char* symbol_name) {
unsigned char fError = 0;
char* p = (char*)(offset + code_base);
 
// Hook for "[extern] rtype foo([?])" declaration
if (((unsigned char)*((char*)(p-1))) == 0xe8){
// call m32
tcc_error_noabort("import symbol '%s' has direct call (not supported),\n\t use __attribute__((dllimport)) prefix", symbol_name);
fError = 1;
}
 
// Hook for MSVC "__declspec(dllimport) rtype(*foo)([?])"
/*if ((((unsigned char)*(p + 4)) == 0xff) &&
(((unsigned char)*(p + 5)) == 0x10)) {*/
if (*((uint16_t*)(p + 4)) == 0x10ff) {
/*
(mov eax [m32])
call dword[eax]
*/
tcc_error_noabort("import symbol '%s' has unsupported call type", symbol_name);
fError = 1;
}
if (reloc_type == R_386_PC32) {
tcc_error_noabort("incorrect relocation type for import symbol '%s'", symbol_name);
fError = 1;
}
if (fError)
tcc_abort();
}
#if /*!*/defined(_DEBUG)// && !defined(_WIN32)
#define kx_debug_output printf
#else
/programs/develop/ktcc/trunk/source/tccmeos.c
2,7 → 2,7
* TCCMEOS.C - KolibriOS/MenuetOS file output for the TinyC Compiler
*
* Copyright (c) 2006 Andrey Khalyavin
* Copyright (c) 2021 Coldy (KX extension)
* Copyright (c) 2021-2022 Coldy (KX extension)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
58,6 → 58,7
#ifdef TCC_TARGET_KX
void kx_init(me_info* me);
void kx_build_imports(me_info* me);
void kx_check_import_error(int reloc_type, const char* code_base, Elf32_Addr offset, const char* symbol_name);
long kx_get_header_length(me_info* me);
void kx_write_header(me_info* me, FILE* f);
void kx_write_imports(me_info* me, FILE* f);
112,8 → 113,11
rel=rel_;
int type = ELF32_R_TYPE(rel->r_info);
rel_=rel+1;
if (type != R_386_PC32 && type != R_386_32)
if (type != R_386_PC32 && type != R_386_32) {
// gcc (and friends) object files is used?
tcc_error("unsupported relocation type %d", type);
continue;
}
int sym = ELF32_R_SYM(rel->r_info);
if (sym>symtab_section->data_offset/sizeof(Elf32_Sym))
continue;
121,15 → 125,17
int sect=esym->st_shndx;
int sh_addr;
ss=findsection(me,sect);
const char* sym_name = strtab_section->data + esym->st_name;
int sym_index;
Elf32_Sym* dyn_sym;
// Import has more less priority in relation to local symbols
if (ss==0)
{
const char *sym_name = strtab_section->data + esym->st_name;
#ifdef TCC_TARGET_KX
int sym_index = find_elf_sym(me->s1->dynsymtab_section, sym_name);
Elf32_Sym* dyn_sym;
sym_index = find_elf_sym(me->s1->dynsymtab_section, sym_name);
if (sym_index == 0) {
#endif
tcc_error_noabort("undefined symbol '%s'", sym_name);
tcc_error_noabort("undefined import symbol '%s'", sym_name);
continue;
#ifdef TCC_TARGET_KX
}
136,19 → 142,25
dyn_sym = &((ElfW(Sym) *)me->s1->dynsymtab_section->data)[sym_index];
sh_addr = dyn_sym->st_value;
if (sh_addr == 0) {
tcc_error_noabort("symbol '%s' has zero value", sym_name);
tcc_error_noabort("import symbol '%s' has zero value", sym_name);
continue;
}
// Stop linking if incorrect import
kx_check_import_error(type, s->data, rel->r_offset, sym_name);
#endif
}
else
else {
if (esym->st_shndx == SHN_UNDEF)
tcc_error("unresolved external symbol '%s'", sym_name);
sh_addr = ss->sh_addr;
}
if (rel->r_offset>s->data_size)
continue;
if (type==R_386_PC32)
*(int*)(rel->r_offset+s->data)+=/*ss->*/sh_addr+esym->st_value-rel->r_offset-s->sh_addr;
*(int*)(rel->r_offset+s->data)+= sh_addr+esym->st_value-rel->r_offset-s->sh_addr;
else if (type==R_386_32)
*(int*)(rel->r_offset+s->data)+=/*ss->*/sh_addr+esym->st_value;
*(int*)(rel->r_offset+s->data)+= sh_addr+esym->st_value;
}
rel=rel_;
s=s->next;