From 2f2a91947f934052d2fdedb352e5d0cba37cba39 Mon Sep 17 00:00:00 2001 From: Coldy Date: Tue, 28 Dec 2021 11:56:49 +0000 Subject: [PATCH] Add KX extension to tcc (autoload w/import table support), phase 2.2 Fixed bug in case unused libraries Improved align algorithm Filled kx folder including docs, libs git-svn-id: svn://kolibrios.org@9513 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../develop/ktcc/trunk/kx/doc/en/Features.txt | 21 + .../ktcc/trunk/kx/doc/en/How to use.txt | 0 .../develop/ktcc/trunk/kx/doc/ru/Features.txt | 30 + .../develop/ktcc/trunk/kx/doc/ru/History.txt | 9 + .../ktcc/trunk/kx/doc/ru/How to use.txt | 98 +++ programs/develop/ktcc/trunk/kx/lib/box.def | 98 +++ .../develop/ktcc/trunk/kx/lib/console.def | 25 + programs/develop/ktcc/trunk/kx/lib/crt0.o | Bin 0 -> 752 bytes programs/develop/ktcc/trunk/kx/lib/dialog.def | 14 + programs/develop/ktcc/trunk/kx/lib/http.def | 9 + programs/develop/ktcc/trunk/kx/lib/img.def | 20 + programs/develop/ktcc/trunk/kx/lib/libc.def | 177 +++++ programs/develop/ktcc/trunk/kx/lib/libck.a | Bin 0 -> 130664 bytes .../develop/ktcc/trunk/kx/lib/libcryptal.a | Bin 0 -> 61346 bytes programs/develop/ktcc/trunk/kx/lib/libtcc.a | Bin 0 -> 6644 bytes .../develop/ktcc/trunk/kx/lib/mbedtls.def | 751 ++++++++++++++++++ .../develop/ktcc/trunk/kx/lib/network.def | 7 + .../develop/ktcc/trunk/kx/src/tests/kxtest.c | 18 + .../develop/ktcc/trunk/kx/src/tests/kxtest.sh | 3 + programs/develop/ktcc/trunk/source/libtcc.c | 14 + programs/develop/ktcc/trunk/source/tcc.h | 1 + programs/develop/ktcc/trunk/source/tcckx.c | 134 +++- programs/develop/ktcc/trunk/tcc.conf | 5 + 23 files changed, 1412 insertions(+), 22 deletions(-) create mode 100644 programs/develop/ktcc/trunk/kx/doc/en/Features.txt create mode 100644 programs/develop/ktcc/trunk/kx/doc/en/How to use.txt create mode 100644 programs/develop/ktcc/trunk/kx/doc/ru/Features.txt create mode 100644 programs/develop/ktcc/trunk/kx/doc/ru/History.txt create mode 100644 programs/develop/ktcc/trunk/kx/doc/ru/How to use.txt create mode 100644 programs/develop/ktcc/trunk/kx/lib/box.def create mode 100644 programs/develop/ktcc/trunk/kx/lib/console.def create mode 100644 programs/develop/ktcc/trunk/kx/lib/crt0.o create mode 100644 programs/develop/ktcc/trunk/kx/lib/dialog.def create mode 100644 programs/develop/ktcc/trunk/kx/lib/http.def create mode 100644 programs/develop/ktcc/trunk/kx/lib/img.def create mode 100644 programs/develop/ktcc/trunk/kx/lib/libc.def create mode 100644 programs/develop/ktcc/trunk/kx/lib/libck.a create mode 100644 programs/develop/ktcc/trunk/kx/lib/libcryptal.a create mode 100644 programs/develop/ktcc/trunk/kx/lib/libtcc.a create mode 100644 programs/develop/ktcc/trunk/kx/lib/mbedtls.def create mode 100644 programs/develop/ktcc/trunk/kx/lib/network.def create mode 100644 programs/develop/ktcc/trunk/kx/src/tests/kxtest.c create mode 100644 programs/develop/ktcc/trunk/kx/src/tests/kxtest.sh create mode 100644 programs/develop/ktcc/trunk/tcc.conf diff --git a/programs/develop/ktcc/trunk/kx/doc/en/Features.txt b/programs/develop/ktcc/trunk/kx/doc/en/Features.txt new file mode 100644 index 0000000000..dca0dd2c88 --- /dev/null +++ b/programs/develop/ktcc/trunk/kx/doc/en/Features.txt @@ -0,0 +1,21 @@ + ++ Library autoload + Now you don't need to think about having to load dependent libraries. + The most of this work will be done by TCC and Dll.obj + ++ Easy linking using *.def files + All you need to do is connect the files describing the symbols + of the used libraries. This files have plain text format and may + easy created in any text editor. If one or more libraries use the same + symbols you may use name prefix to solve symbols conflicts + No more complicated of creating *.o and/or *.a files + ++ Reduced image size + Since the library loader no longer needs to be placed in every application, + this reduces the size of the image. No more C layer neded, all dependent + libraries loading and also initialized automatically. + The compact format of the import table is also used. + ++ Backward compatible + You don't need change your project. But the features described above will + require reconfiguration. Once you have tried it, you do not want to come back. \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/kx/doc/en/How to use.txt b/programs/develop/ktcc/trunk/kx/doc/en/How to use.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/programs/develop/ktcc/trunk/kx/doc/ru/Features.txt b/programs/develop/ktcc/trunk/kx/doc/ru/Features.txt new file mode 100644 index 0000000000..1d7178eaff --- /dev/null +++ b/programs/develop/ktcc/trunk/kx/doc/ru/Features.txt @@ -0,0 +1,30 @@ + +Версия расширения KX - 0.4.3 + +Обзор новых возможностей + + + Автозагрузка библиотек + Теперь Вам не нужно думать о загрузке зависимых библиотек. + Большая часть этой работы будет сделана TCC и Dll.obj. + + + Простое связывание с использованием *.def файлов + Все, что Вам нужно сделать, это подключить файлы с описанием символов + используемых библиотек. Эти файлы имеют простой текстовый формат и могут + легко создаваться в любом текстовом редакторе. Если одна или несколько + библиотек используют один или более одинаковых символов, Вы можете + использовать префикс имени для разрешения конфликтов символов. + Больше не нужно создавать и подключать сложные *.o и/или *.a файлы + зависимых бибилиотек (исключение - файлы crt0.o и libtcc.a, но они + поставляются в комлекте). + + + Уменьшенный размер образа + Поскольку загрузчик библиотек больше не нужно размещать в каждом + приложении, это уменьшает размер образа. Больше не нужен слой C + (C layer), все зависимые библиотеки загружаются, а также инициализируются + автоматически. Также используется компактный формат таблицы импорта. + + + Обратная совместимость + Если Вы по каким то причинам не хотите, либо пока не готовы использовать + новые возможности, изменять настройки проекта не требуется. Все будет + работать как раньше. Но для использования описанных выше особенностей + требуется несложная перенастройка проекта. \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/kx/doc/ru/History.txt b/programs/develop/ktcc/trunk/kx/doc/ru/History.txt new file mode 100644 index 0000000000..103d0707b9 --- /dev/null +++ b/programs/develop/ktcc/trunk/kx/doc/ru/History.txt @@ -0,0 +1,9 @@ + +0.4.4 + + + + , + + +0.4.3 + , + tcc \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/kx/doc/ru/How to use.txt b/programs/develop/ktcc/trunk/kx/doc/ru/How to use.txt new file mode 100644 index 0000000000..fbcb671f07 --- /dev/null +++ b/programs/develop/ktcc/trunk/kx/doc/ru/How to use.txt @@ -0,0 +1,98 @@ + + + KX + tcc.conf tcc + + %ktcc_root%\ %ktcc_root%\kx. + + lib + *.def, crt.0 libtcc.a + + + KX + . , + . , + + + -llibc + + tcc : libc.def, liblibc.def, liblibc.a + , + . , + KX + *.def + + tcc (. tcc) + : + -nobss , ( + bss , + + ) + + + KX (*.def). *.def + + . *.def . + + ; + ; + ; LIBRARY + ; c ( 3 ) + LIBRARY libname.obj + + ; EXPORTS + ; prefix + EXPORTS [prefix] + + ; prefix, + ; ( ) + ; . + ; , http.obj http_ + ; http_get get + [libname_]entry1 + [libname_]entry2 + + ; + + KX + , tcc KX: + 1. + tcc -v + , KX + tcc version 0.9.26 (i386 KolibriOS/KX extension) + + 2. + __KX__, + #ifdef __KX__ + // KX + #else + // , KX + #endif + + , , + KX. + , + . + + . + + + , + KX, , + , + . + KX. + + ... + + #ifdef _C_LAYER + // KX + / + if(!kolibri_libimg_init()){ // libimg.obj + notify_show("Libimg.obj not loaded!' -E"); + exit(0); + } + #endif + + ... + \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/kx/lib/box.def b/programs/develop/ktcc/trunk/kx/lib/box.def new file mode 100644 index 0000000000..a2f3cccce5 --- /dev/null +++ b/programs/develop/ktcc/trunk/kx/lib/box.def @@ -0,0 +1,98 @@ +LIBRARY box_lib.obj + +EXPORTS +edit_box +edit_box_key +edit_box_mouse +edit_box_set_text +version_ed +init_checkbox2 +check_box_draw2 +check_box_mouse2 +version_ch2 +option_box_draw +option_box_mouse +version_op +scrollbar_v_draw +scrollbar_v_mouse +scrollbar_h_draw +scrollbar_h_mouse +version_scrollbar +dbutton_draw +dbutton_mouse +version_dbutton +menu_bar_draw +menu_bar_mouse +menu_bar_activate +version_menu_bar +FileBrowser_draw +FileBrowser_mouse +FileBrowser_key +version_FileBrowser +tl_data_init +tl_data_clear +tl_info_clear +tl_key +tl_mouse +tl_draw +tl_info_undo +tl_info_redo +tl_node_add +tl_node_set_data +tl_node_get_data +tl_node_delete +tl_cur_beg +tl_cur_next +tl_cur_perv +tl_node_close_open +tl_node_lev_inc +tl_node_lev_dec +tl_node_move_up +tl_node_move_down +tl_node_poi_get_info +tl_node_poi_get_next_info +tl_node_poi_get_data +tl_save_mem +tl_load_mem +tl_get_mem_size +version_tree_list +PathShow_prepare +PathShow_draw +version_PathShow +ted_but_sumb_upper +ted_but_sumb_lover +ted_but_convert_by_table +ted_can_save +ted_clear +ted_delete +ted_draw +ted_init +ted_init_scroll_bars +ted_init_syntax_file +ted_is_select +ted_key +ted_mouse +ted_open_file +ted_save_file +ted_text_add +ted_but_select_word +ted_but_cut +ted_but_copy +ted_but_paste +ted_but_undo +ted_but_redo +ted_but_reverse +ted_but_find +ted_but_replace +ted_text_colored +ted_go_to_position +version_text_edit +frame_draw +version_frame +progressbar_draw +progressbar_progress +tooltip_init +tooltip_delete +tooltip_test_show +tooltip_mouse +get_font_size diff --git a/programs/develop/ktcc/trunk/kx/lib/console.def b/programs/develop/ktcc/trunk/kx/lib/console.def new file mode 100644 index 0000000000..c1de63d2a2 --- /dev/null +++ b/programs/develop/ktcc/trunk/kx/lib/console.def @@ -0,0 +1,25 @@ +LIBRARY console.obj + +EXPORTS +;START +con_init +con_write_asciiz +con_write_string +con_printf +con_exit +;version +con_get_flags +con_set_flags +con_kbhit +con_getch +con_getch2 +con_gets +con_gets2 +con_get_font_height +con_get_cursor_height +con_set_cursor_height +con_cls +con_get_cursor_pos +con_set_cursor_pos +con_set_title +con_get_input \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/kx/lib/crt0.o b/programs/develop/ktcc/trunk/kx/lib/crt0.o new file mode 100644 index 0000000000000000000000000000000000000000..b857c80565641ceef35a5b36895c6c7327e396d8 GIT binary patch literal 752 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 ZTwPlaTHX#n#zP#MVY+qzcwxHs{{p~jV^078 literal 0 HcmV?d00001 diff --git a/programs/develop/ktcc/trunk/kx/lib/libcryptal.a b/programs/develop/ktcc/trunk/kx/lib/libcryptal.a new file mode 100644 index 0000000000000000000000000000000000000000..59467f1660c8e0ff6c960d98c0fe18f97f6d228b GIT binary patch literal 61346 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 EFX%=VwEzGB literal 0 HcmV?d00001 diff --git a/programs/develop/ktcc/trunk/kx/lib/libtcc.a b/programs/develop/ktcc/trunk/kx/lib/libtcc.a new file mode 100644 index 0000000000000000000000000000000000000000..77e05da5e8b1232f9ec40bed14c96f5e922a6c9e GIT binary patch literal 6644 zcmd^DVN4vy6`lhU4)@x-rdDGoX?;#<%BATAj7@`7HCB@8kBUw0DBJW$6^uD7s326_ z;o4OkhhAtj8eHXvt44}{SSm?q#0RdT-Dzz)^&AgfS-n{p{H*fZ4@Aq1ITHC+Bd+vudegoBSWCLS#~bVPdl>8V#xkv~&8^2X&Brp`oltPBv%4kJ`$VcEeJn_& z)=(!D)p4TtiFEo{s)HC6kqQzgd}5Vnl|j$8cDA+jG`F_2wzn~I82%@_O^h~+O~d~E zDkk;&49Afjr+L#4LZJ{sYL&g=30s;yxan7740e*BoUV*QshRkAlCPlb!u z2Adz3Jbd|0&F(i}_IrpvG$RrG=N4KinLgQ-X*r5E)1%r<+lh>J$>-dv#{QySZxigl>S5pbStfG2GW3_wI}iWp(`$ppO#%U3*B=YDuL9nGes`l-BmyFv z#o`EfwiAozz_%x$FAxiCd_NQ#e-G{rV^O#LSe(=A1!M7;e6l($AF7VXrs~+=%Zu0k z2qN5k1NQ*cvF$$_;l3*%z8UUK;MorDPl9iwJ46xFcK2Y#zPaG#Q;Ik65d`9xT;8T*%W(zFZ ze_qMXOKYleBKm7`NrJ_mlGgkuR|TIC_RKH_nc(Bj{T{E9i=sbF*#^eCzY;4JnR){Q zG(z;afR<8SlJ6q%XR3*h&j`M#wJ%{t@L_2!O1>oRVX-4SRw2rq8dM_Ks_lCaVp?Fr zm}OMn>8pex0!m2XYewN~M&Wxf8VaL-9ufSaFh3eo48NRZ8IfEZ}(dE1pU? z1S)$ID2Fzi@*CJ-9cj&c+nT?f&jM0m%{XD2#tXc*XW#{6;00q~0}LFFLxr?1B_;$P zQSM)wUW6IKIxnpeX`i3|s0uzJqKF)(JoGU&jc89QyOh9;u+AxgbDn?-h$nzNn3DD+ zJk@c=+ysU01HlJ{JtX;%2l}&jku8Sm_b?fRZ4q=Z<%RP)XFRjAiL%HJ0%1U+| z`*=y%ImwG^<4`by1|jPvr42xGh!$y`B(0tV_ED}B0nb}ng%I#pi2*oa0~hQWS{};* z4gr(wnB-JTsCc|9?4?gWfRz9OD@I?%7JvglWGVXUSZEaK7@7bu@RX9%4oe8To;|4!6;IRIl~LE zXk*^>fJPu;GQJ=zL^+l%#G?aV5sqbZacLpkc|l>BE~q_J94(+O7M*$}3w{*sZ>c^q zKQ^6vJx+ujqm(O7e@NAcl7{A>V1wH)o4lYPxlS7(f1Ne}APoens<-!H z%LX_oUl)To6ud&E76uNG2PCE09fQAfr@&L}n_vJ1Omkg@E2rGKE)2RTF2P_E_u9~@ zGBB`9jUyDr!-uZiQ=J_TJ4p;ViFM-(w!1L9KqZ>ZbJwG|`@gsbVKT?Vb9QlIR&UFG z^_fDxt1lC01U*cR=5FmgUz@Ann2> z=o+_Nu{BuaWfc&s|ykc>E^iQ1t8w!l)`XO*>!0kHn+4whRQZ?jv4L+c`rL5nx?z2}Q{XEr z5rVC()MZLr34y+4I_(x#tqlJ^TL~zz`{@^t`{2ecs@K|QE84%mA+ZW}b){d+6Z9e6 z1pN*z^$q<8^yyqO^!w=V!b=H7{8U^h?1pyHkK;A`dGu=nbQ%8e)CTBE(Dw!CFQ8A) zT}WNJC!@8fPjW=>1zm&1UPenaW$inluWGsh?Fdqk4oI3mi1uHgsTvdgL$q;ZFZoUM zqiA0Q{fwp`N1H&AG;}-YS3nzmzX1I=&?(I?(B2Pc4gCV>-v{VdKv!152F*{^=-;64 z*8aQ&dJmj_PtVVw{TTF1n*Jx+bNF&FbOH1OUtFal(31mAxRF21TuQX++g<<8*T3lv z-VXbhzBlwDxG70@%l_3cE`ytrbQkT9;6k`5dBDF1UcKp8S#bdD$0U2rnhl4)Vdqv`be%i^B4PR*2V*B8i;+vbBTp-fqGXM7E7 zn+L9{2PP{%K%kx)94-fSpBlqQqHxQ + +int main(){ + + char* kx_ext = +#ifndef __KX__ + "not " +#endif + "supported" + ; + + printf("KX extension %s", kx_ext); + + return 0; +} \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/kx/src/tests/kxtest.sh b/programs/develop/ktcc/trunk/kx/src/tests/kxtest.sh new file mode 100644 index 0000000000..94fb434702 --- /dev/null +++ b/programs/develop/ktcc/trunk/kx/src/tests/kxtest.sh @@ -0,0 +1,3 @@ +#SHS +../../../tcc ../src/tests/kxtest.c -o kxtest -I../../include -llibc +exit \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/source/libtcc.c b/programs/develop/ktcc/trunk/source/libtcc.c index 23a3ff3846..6577cf2e41 100644 --- a/programs/develop/ktcc/trunk/source/libtcc.c +++ b/programs/develop/ktcc/trunk/source/libtcc.c @@ -113,12 +113,17 @@ static void tcc_set_lib_path_w32(TCCState *s) { char path[1024], *p; GetModuleFileNameA(tcc_module, path, sizeof path); +#ifdef TCC_TARGET_KX + kx_fix_root_directory(path, sizeof path); + normalize_slashes(strlwr(path)); +#else p = tcc_basename(normalize_slashes(strlwr(path))); if (p - 5 > path && 0 == strncmp(p - 5, "/bin/", 5)) p -= 5; else if (p > path) p--; *p = 0; +#endif tcc_set_lib_path(s, path); } @@ -154,9 +159,13 @@ static void tcc_set_lib_path_kos(TCCState *s) char** argv0 = (char**)0x20; // path in kolibri header char path[1024], *p; strncpy(path, *argv0, sizeof path); +#ifdef TCC_TARGET_KX + kx_fix_root_directory(path, sizeof path); +#else p = tcc_basename(path); if (p > path) p--; *p = 0; +#endif tcc_set_lib_path(s, path); } @@ -165,7 +174,12 @@ static void tcc_set_lib_path_linux(TCCState *s) { char buff[4096+1]; readlink("/proc/self/exe", buff, 4096); +#ifdef TCC_TARGET_KX + kx_fix_root_directory(buff, sizeof buff); + const char *path = buff; +#else const char *path = dirname(buff); +#endif tcc_set_lib_path(s, path); } diff --git a/programs/develop/ktcc/trunk/source/tcc.h b/programs/develop/ktcc/trunk/source/tcc.h index 6f30943e82..16ef960787 100644 --- a/programs/develop/ktcc/trunk/source/tcc.h +++ b/programs/develop/ktcc/trunk/source/tcc.h @@ -47,6 +47,7 @@ #ifndef TCC_TARGET_MEOS #define TCC_TARGET_MEOS #endif +void kx_fix_root_directory(char *buf, size_t size); #endif #ifndef _WIN32 diff --git a/programs/develop/ktcc/trunk/source/tcckx.c b/programs/develop/ktcc/trunk/source/tcckx.c index d64841d4f7..86bb813973 100644 --- a/programs/develop/ktcc/trunk/source/tcckx.c +++ b/programs/develop/ktcc/trunk/source/tcckx.c @@ -34,7 +34,7 @@ typedef struct { /*union ImportEntry { uint32_t ImportStr; uint32_t ImportPrt; - };*/ +};*/ //static char __kx_import_table_sym[] = "__i_ptr__"; @@ -43,19 +43,21 @@ typedef struct { ElfW(Sym) *sym; int sym_index, sym_end; sym_end = symtab_section->data_offset / sizeof(ElfW(Sym)); + DLLReference **dllref = me->s1->loaded_dlls; CString *str_arr, *len_arr, *sym_arr; - char dll_len; + char dll_len; + int dll_loaded = me->s1->nb_loaded_dlls; int nlib = 0; int i; if (me->header.version != 2) return; - str_arr = tcc_malloc(sizeof(CString) * me->s1->nb_loaded_dlls); + str_arr = tcc_malloc(sizeof(CString) * dll_loaded); - len_arr = tcc_malloc(sizeof(CString)* me->s1->nb_loaded_dlls); - - sym_arr = tcc_malloc(sizeof(CString)* me->s1->nb_loaded_dlls); + len_arr = tcc_malloc(sizeof(CString)* dll_loaded); + + sym_arr = tcc_malloc(sizeof(CString)* dll_loaded); for (sym_index = 1; sym_index < sym_end; ++sym_index) { sym = (ElfW(Sym) *)symtab_section->data + sym_index; @@ -66,18 +68,13 @@ typedef struct { if (dynsym_index == 0) { //if (strcmp(name, __kx_import_table_sym) != 0) { tcc_error/*_noabort*/("undefined symbol '%s'", name); - //continue; // FIXME: stop compile! - //} - - //continue; } // KOS support 32 bit only Elf32_Sym* dyn_sym = &((ElfW(Sym) *)me->s1->dynsymtab_section->data)[dynsym_index]; - DLLReference **dllref = me->s1->loaded_dlls; - char* dll_name; - i = dyn_sym->st_size - 1; + char* dll_name; // TCC store dll index in dyn_sym->st_size field + i = dyn_sym->st_size - 1; if (dllref[i]->level != -1) { dll_name = dllref[i]->name; dll_len = strlen(dll_name) + 1; @@ -86,15 +83,15 @@ typedef struct { cstr_new(&str_arr[i]); cstr_new(&len_arr[i]); - cstr_new(&sym_arr[i]); + cstr_new(&sym_arr[i]); cstr_ccat(&len_arr[i], dll_len); cstr_cat(&str_arr[i], dll_name, dll_len); //Mark dll as already used dllref[i]->level = -1; } - - cstr_wccat(&sym_arr[i], (int)name); + + cstr_wccat(&sym_arr[i], (int)name); // Export defined with prefix? if (dyn_sym->st_value == -1){ @@ -114,6 +111,46 @@ typedef struct { //tcc_error(""); return; }*/ + + // Fixed BUG#15 (possible access to uninitialized due unused library) + // Exclude unused librarys + if (nlib < dll_loaded) { + i = 0; int j, n = 0; + do { + + // Find unused library + if (dllref[i]->level == 0) { + j = i + 1; + + while (j < dll_loaded) { + // Find first used library + if (dllref[j]->level == -1) { + // Found, copy i from j + str_arr[i] = str_arr[j]; + len_arr[i] = len_arr[j]; + sym_arr[i] = sym_arr[j]; + // Mark j as unused + dllref[j]->level = 0; + + if (++n == nlib) + goto __done; + + break; + } + + j++; + + } + + } + + i++; + + } while (i < dll_loaded); + + } + + __done: // Zero terminate of ptr (was BUG#3) i = 0; @@ -128,7 +165,7 @@ typedef struct { kx_import_table* imp_sect; imp_sect = tcc_mallocz(sizeof(kx_import_table)); - imp_sect->data = tcc_mallocz(1024); // FIXME!!! + imp_sect->data = tcc_mallocz(4096); // FIXME!!! I increased it to 4Kb, but steel need dynamicaly size imp_sect->data_size = 0; //imp_sect->sh_addr = me->header.image_size;// +1; @@ -147,6 +184,7 @@ typedef struct { // Align pad (check algorithm!) int align = 4 - (me->header.image_size + imp_sect->data_size) % 4; + align = align < 4 ? align : 0; imp_data += align; imp_sect->data_size += align; @@ -187,7 +225,7 @@ typedef struct { imp_sect->data_size += sizeof(LibraryEntry) + 4; const char *sym_name; - char name_len; + char name_len; long len_sum; len_sum = me->header.image_size; @@ -230,7 +268,7 @@ typedef struct { tcc_free(str_arr); tcc_free(len_arr); - tcc_free(sym_arr); + tcc_free(sym_arr); } @@ -246,11 +284,9 @@ typedef struct { break; } if ((sym_index < sym_end) && - // ... and user attached at last one *.def + // ... and user attached at least one *.def (me->s1->nb_loaded_dlls)) me->header.version = 2; - - //tcc_add_crt(me->s1, "start1.o"); } long kx_get_header_length(me_info* me) { @@ -277,4 +313,58 @@ typedef struct { tcc_free(imp->data); tcc_free(imp); } + } + +#if /*!*/defined(_DEBUG)// && !defined(_WIN32) + #define kx_debug_output printf +#else + #define kx_debug_output(s,p) ((void)0) +#endif + +/* + Calling once from tcc_set_lib_path_xxx + This function correct tcc_root if tcc_root/kx is a run directory, + otherwise do trim filename +*/ + void kx_fix_root_directory(char *buf, size_t size) { + + int defult = 1; + char* tcc_conf = tcc_malloc(strlen(buf)+5); + strcpy(tcc_conf, buf); + char* base = tcc_basename(tcc_conf); + *base = 0; + base = tcc_basename(buf); + strcat(tcc_conf, "tcc.conf"); + FILE* f = fopen(tcc_conf,"r"); + if (f) { + char line[100]; + while (fgets(line, sizeof line, f)){ + switch (*line) + case '#': + case '\n': + continue; + if ((strspn(line, "tcc_root") == 8) && line[8] == ' ') { + + if (strcmp(line + 9, "kx") == 0) { + strcpy(base, line + 9); + defult = 0; + } + else + { + // Disallow change tcc_root with arbitrary path + continue; + } + + } + } + + fclose(f); + } + if (defult) { + + *--base = 0; + } + + tcc_free(tcc_conf); + //kx_debug_output("tcc root = %s\n", buf); } \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/tcc.conf b/programs/develop/ktcc/trunk/tcc.conf new file mode 100644 index 0000000000..d2521e89cb --- /dev/null +++ b/programs/develop/ktcc/trunk/tcc.conf @@ -0,0 +1,5 @@ +# This configuration file for TCC behaviour +# (actually was added for on/off KX extension) + +# Change %ktcc_root%\ to %ktcc_root%\kx +tcc_root kx \ No newline at end of file