/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; |