From 90cf9246ac6fa41ee80b410abb7ac175dce4de47 Mon Sep 17 00:00:00 2001 From: "Magomed Kostoev (mkostoevr)" Date: Sat, 16 May 2020 08:07:10 +0000 Subject: [PATCH] Implement dynamic linking with system libraries via -lsyslibname: console.obj http.ibj InputBox.obj Add header files for apps what dynamically link these libraries. git-svn-id: svn://kolibrios.org@7925 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/ktcc/trunk/bin/lib/start.o | Bin 760 -> 1340 bytes .../ktcc/trunk/lib/console/__lib__.asm | 9 + .../ktcc/trunk/lib/console/__lib__.inc | 2 + .../ktcc/trunk/lib/console/con_cls.asm | 18 ++ .../ktcc/trunk/lib/console/con_exit.asm | 18 ++ .../lib/console/con_get_cursor_height.asm | 18 ++ .../trunk/lib/console/con_get_cursor_pos.asm | 18 ++ .../ktcc/trunk/lib/console/con_get_flags.asm | 18 ++ .../trunk/lib/console/con_get_font_height.asm | 18 ++ .../ktcc/trunk/lib/console/con_getch.asm | 18 ++ .../ktcc/trunk/lib/console/con_getch2.asm | 18 ++ .../ktcc/trunk/lib/console/con_gets.asm | 18 ++ .../ktcc/trunk/lib/console/con_gets2.asm | 18 ++ .../ktcc/trunk/lib/console/con_init.asm | 18 ++ .../ktcc/trunk/lib/console/con_kbhit.asm | 18 ++ .../ktcc/trunk/lib/console/con_printf.asm | 18 ++ .../trunk/lib/console/con_set_cursor_pos.asm | 18 ++ .../ktcc/trunk/lib/console/con_set_flags.asm | 18 ++ .../ktcc/trunk/lib/console/con_set_title.asm | 18 ++ .../trunk/lib/console/con_write_asciiz.asm | 18 ++ .../trunk/lib/console/con_write_string.asm | 18 ++ .../develop/ktcc/trunk/lib/console/make.bat | 22 +++ .../develop/ktcc/trunk/lib/http/__lib__.asm | 9 + .../develop/ktcc/trunk/lib/http/__lib__.inc | 2 + programs/develop/ktcc/trunk/lib/http/get.asm | 18 ++ programs/develop/ktcc/trunk/lib/http/head.asm | 18 ++ programs/develop/ktcc/trunk/lib/http/make.bat | 9 + programs/develop/ktcc/trunk/lib/http/post.asm | 18 ++ .../develop/ktcc/trunk/lib/http/receive.asm | 18 ++ programs/develop/ktcc/trunk/lib/http/send.asm | 18 ++ .../ktcc/trunk/lib/inputbox/InputBox.asm | 18 ++ .../ktcc/trunk/lib/inputbox/__lib__.asm | 9 + .../ktcc/trunk/lib/inputbox/__lib__.inc | 2 + .../develop/ktcc/trunk/lib/inputbox/make.bat | 5 + .../develop/ktcc/trunk/lib/sample/__lib__.asm | 9 + .../develop/ktcc/trunk/lib/sample/__lib__.inc | 2 + .../develop/ktcc/trunk/lib/sample/howto.txt | 13 ++ .../develop/ktcc/trunk/lib/sample/make.bat | 5 + .../ktcc/trunk/lib/sample/sample_symbol.asm | 18 ++ .../ktcc/trunk/libc/include/kos/console.h | 183 ++++++++++++++++++ .../ktcc/trunk/libc/include/kos/http.h | 139 +++++++++++++ .../ktcc/trunk/libc/include/kos/inputbox.h | 17 ++ .../develop/ktcc/trunk/libc/start/start.asm | 115 +++++++++-- .../ktcc/trunk/libc/start/start.old.asm | 143 ++++++++++++++ .../develop/ktcc/trunk/samples/build_all.sh | 1 + programs/develop/ktcc/trunk/samples/dynamic.c | 19 ++ 46 files changed, 1146 insertions(+), 19 deletions(-) create mode 100644 programs/develop/ktcc/trunk/lib/console/__lib__.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/__lib__.inc create mode 100644 programs/develop/ktcc/trunk/lib/console/con_cls.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_exit.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_get_cursor_height.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_get_cursor_pos.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_get_flags.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_get_font_height.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_getch.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_getch2.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_gets.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_gets2.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_init.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_kbhit.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_printf.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_set_cursor_pos.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_set_flags.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_set_title.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_write_asciiz.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/con_write_string.asm create mode 100644 programs/develop/ktcc/trunk/lib/console/make.bat create mode 100644 programs/develop/ktcc/trunk/lib/http/__lib__.asm create mode 100644 programs/develop/ktcc/trunk/lib/http/__lib__.inc create mode 100644 programs/develop/ktcc/trunk/lib/http/get.asm create mode 100644 programs/develop/ktcc/trunk/lib/http/head.asm create mode 100644 programs/develop/ktcc/trunk/lib/http/make.bat create mode 100644 programs/develop/ktcc/trunk/lib/http/post.asm create mode 100644 programs/develop/ktcc/trunk/lib/http/receive.asm create mode 100644 programs/develop/ktcc/trunk/lib/http/send.asm create mode 100644 programs/develop/ktcc/trunk/lib/inputbox/InputBox.asm create mode 100644 programs/develop/ktcc/trunk/lib/inputbox/__lib__.asm create mode 100644 programs/develop/ktcc/trunk/lib/inputbox/__lib__.inc create mode 100644 programs/develop/ktcc/trunk/lib/inputbox/make.bat create mode 100644 programs/develop/ktcc/trunk/lib/sample/__lib__.asm create mode 100644 programs/develop/ktcc/trunk/lib/sample/__lib__.inc create mode 100644 programs/develop/ktcc/trunk/lib/sample/howto.txt create mode 100644 programs/develop/ktcc/trunk/lib/sample/make.bat create mode 100644 programs/develop/ktcc/trunk/lib/sample/sample_symbol.asm create mode 100644 programs/develop/ktcc/trunk/libc/include/kos/console.h create mode 100644 programs/develop/ktcc/trunk/libc/include/kos/http.h create mode 100644 programs/develop/ktcc/trunk/libc/include/kos/inputbox.h create mode 100644 programs/develop/ktcc/trunk/libc/start/start.old.asm create mode 100644 programs/develop/ktcc/trunk/samples/dynamic.c diff --git a/programs/develop/ktcc/trunk/bin/lib/start.o b/programs/develop/ktcc/trunk/bin/lib/start.o index 573db80601f6fe59223d67bb525ba7d907015c2f..598dbd5fcc55a9cee4f36a0c51637eb436c45943 100644 GIT binary patch delta 772 zcmYjPO=uHA6rP#vhE0t0N3DuhgG!Vlgfxk0Ef}=Mi>h_V(8 zb1|+6J?O<-Nj(`zTE!)iY7gl2N*}PIZO$`Mzl9GxVPH-j5NgEGm}%yEX#6l^tN}7=o>Y&(e;LtM&jy zREi#+oXJn+CUk|}m26JU8mo#^jaX|92^k-xh?U?T6i}%inE#~}4=l}F+Fq6EiX8_& z$jPPTrt{;YbOf$wVy&TY`t{lXlv}w8ral5@nI~CVxgq3eT8UWD?>=J)X?;u&ut9q_ zP(WNZ8jACso|TL?(+O|IRm@!BGX@KRh*f#5dttb?<1s$5T$U5Uv-fAiFiY6%AqP{u zgVY!uRXXDbK)98-Iw@+W#>VMr06OSoce>eYJna_x@8R~XhvjGt-zrasww;4m()srI zvwf<(uwS?U-Z8kSg$2ouQ zOl3H&4^@U2^?2oxrIV%RrLCQnHd={QFDfPR^cw;Tv%5e9G`y<4{)aJ|#LXIrpyo`z zIF-xa$!q-910P>@NZ>Pp3j$vXd?k{>h+hc?V^Nbh$jHFp4$%xIfm|>E0087IHUIzs diff --git a/programs/develop/ktcc/trunk/lib/console/__lib__.asm b/programs/develop/ktcc/trunk/lib/console/__lib__.asm new file mode 100644 index 0000000000..eac1985673 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/__lib__.asm @@ -0,0 +1,9 @@ +format ELF + +include '__lib__.inc' + +section '.text' + +public lib_name + +lib_name db 0x55, 0xAA, lib_name_str, 0 diff --git a/programs/develop/ktcc/trunk/lib/console/__lib__.inc b/programs/develop/ktcc/trunk/lib/console/__lib__.inc new file mode 100644 index 0000000000..95e4174cb8 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/__lib__.inc @@ -0,0 +1,2 @@ +lib_name equ @console.obj +lib_name_str equ '/sys/lib/console.obj' diff --git a/programs/develop/ktcc/trunk/lib/console/con_cls.asm b/programs/develop/ktcc/trunk/lib/console/con_cls.asm new file mode 100644 index 0000000000..48e77730b2 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_cls.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_cls +fun_str equ 'con_cls' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_exit.asm b/programs/develop/ktcc/trunk/lib/console/con_exit.asm new file mode 100644 index 0000000000..bf47d56217 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_exit.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_exit +fun_str equ 'con_exit' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_get_cursor_height.asm b/programs/develop/ktcc/trunk/lib/console/con_get_cursor_height.asm new file mode 100644 index 0000000000..f0138dc0ac --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_get_cursor_height.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_get_cursor_height +fun_str equ 'con_get_cursor_height' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_get_cursor_pos.asm b/programs/develop/ktcc/trunk/lib/console/con_get_cursor_pos.asm new file mode 100644 index 0000000000..ddc7bcceea --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_get_cursor_pos.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_get_cursor_pos +fun_str equ 'con_get_cursor_pos' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_get_flags.asm b/programs/develop/ktcc/trunk/lib/console/con_get_flags.asm new file mode 100644 index 0000000000..f73a06dd26 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_get_flags.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_get_flags +fun_str equ 'con_get_flags' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_get_font_height.asm b/programs/develop/ktcc/trunk/lib/console/con_get_font_height.asm new file mode 100644 index 0000000000..f54d8d1c34 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_get_font_height.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_get_font_height +fun_str equ 'con_get_font_height' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_getch.asm b/programs/develop/ktcc/trunk/lib/console/con_getch.asm new file mode 100644 index 0000000000..286a93b97d --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_getch.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_getch +fun_str equ 'con_getch' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_getch2.asm b/programs/develop/ktcc/trunk/lib/console/con_getch2.asm new file mode 100644 index 0000000000..fccd836b13 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_getch2.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_getch2 +fun_str equ 'con_getch2' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_gets.asm b/programs/develop/ktcc/trunk/lib/console/con_gets.asm new file mode 100644 index 0000000000..04c3f873fe --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_gets.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_gets +fun_str equ 'con_gets' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_gets2.asm b/programs/develop/ktcc/trunk/lib/console/con_gets2.asm new file mode 100644 index 0000000000..10df5acf78 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_gets2.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_gets2 +fun_str equ 'con_gets2' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_init.asm b/programs/develop/ktcc/trunk/lib/console/con_init.asm new file mode 100644 index 0000000000..cd5e4eae3a --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_init.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_init +fun_str equ 'con_init' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_kbhit.asm b/programs/develop/ktcc/trunk/lib/console/con_kbhit.asm new file mode 100644 index 0000000000..2a96ebe52d --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_kbhit.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_kbhit +fun_str equ 'con_kbhit' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_printf.asm b/programs/develop/ktcc/trunk/lib/console/con_printf.asm new file mode 100644 index 0000000000..ab7cdd7b59 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_printf.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_printf +fun_str equ 'con_printf' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_set_cursor_pos.asm b/programs/develop/ktcc/trunk/lib/console/con_set_cursor_pos.asm new file mode 100644 index 0000000000..e0b87fb0a4 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_set_cursor_pos.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_set_cursor_pos +fun_str equ 'con_set_cursor_pos' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_set_flags.asm b/programs/develop/ktcc/trunk/lib/console/con_set_flags.asm new file mode 100644 index 0000000000..41c1db1976 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_set_flags.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_set_flags +fun_str equ 'con_set_flags' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_set_title.asm b/programs/develop/ktcc/trunk/lib/console/con_set_title.asm new file mode 100644 index 0000000000..394bb5d7c6 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_set_title.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_set_title +fun_str equ 'con_set_title' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_write_asciiz.asm b/programs/develop/ktcc/trunk/lib/console/con_write_asciiz.asm new file mode 100644 index 0000000000..6fb90e78da --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_write_asciiz.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_write_asciiz +fun_str equ 'con_write_asciiz' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/con_write_string.asm b/programs/develop/ktcc/trunk/lib/console/con_write_string.asm new file mode 100644 index 0000000000..efdbbbd306 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/con_write_string.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ con_write_string +fun_str equ 'con_write_string' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/console/make.bat b/programs/develop/ktcc/trunk/lib/console/make.bat new file mode 100644 index 0000000000..71304d4821 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/console/make.bat @@ -0,0 +1,22 @@ +fasm __lib__.asm +fasm con_write_asciiz.asm +fasm con_write_string.asm +fasm con_init.asm +fasm con_exit.asm +fasm con_set_title.asm +fasm con_printf.asm +fasm con_get_flags.asm +fasm con_set_flags.asm +fasm con_get_font_height.asm +fasm con_get_cursor_height.asm +fasm con_getch.asm +fasm con_getch2.asm +fasm con_kbhit.asm +fasm con_gets.asm +fasm con_gets2.asm +fasm con_cls.asm +fasm con_get_cursor_pos.asm +fasm con_set_cursor_pos.asm +kos32-ar -ru libconsole.a *.o +del *.o +pause \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/http/__lib__.asm b/programs/develop/ktcc/trunk/lib/http/__lib__.asm new file mode 100644 index 0000000000..eac1985673 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/http/__lib__.asm @@ -0,0 +1,9 @@ +format ELF + +include '__lib__.inc' + +section '.text' + +public lib_name + +lib_name db 0x55, 0xAA, lib_name_str, 0 diff --git a/programs/develop/ktcc/trunk/lib/http/__lib__.inc b/programs/develop/ktcc/trunk/lib/http/__lib__.inc new file mode 100644 index 0000000000..879a487980 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/http/__lib__.inc @@ -0,0 +1,2 @@ +lib_name equ @http.obj +lib_name_str equ '/sys/lib/http.obj' \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/http/get.asm b/programs/develop/ktcc/trunk/lib/http/get.asm new file mode 100644 index 0000000000..2ebfd3d670 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/http/get.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ get +fun_str equ 'get' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/http/head.asm b/programs/develop/ktcc/trunk/lib/http/head.asm new file mode 100644 index 0000000000..138a86b201 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/http/head.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ head +fun_str equ 'head' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/http/make.bat b/programs/develop/ktcc/trunk/lib/http/make.bat new file mode 100644 index 0000000000..482cda55c3 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/http/make.bat @@ -0,0 +1,9 @@ +fasm __lib__.asm +fasm get.asm +fasm head.asm +fasm post.asm +fasm receive.asm +fasm send.asm +kos32-ar -ru libhttp.a *.o +del *.o +pause \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/http/post.asm b/programs/develop/ktcc/trunk/lib/http/post.asm new file mode 100644 index 0000000000..e9d9c51f65 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/http/post.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ post +fun_str equ 'post' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/http/receive.asm b/programs/develop/ktcc/trunk/lib/http/receive.asm new file mode 100644 index 0000000000..4044fd7058 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/http/receive.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ receive +fun_str equ 'receive' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/http/send.asm b/programs/develop/ktcc/trunk/lib/http/send.asm new file mode 100644 index 0000000000..fea2ef2a8d --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/http/send.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ send +fun_str equ 'send' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/inputbox/InputBox.asm b/programs/develop/ktcc/trunk/lib/inputbox/InputBox.asm new file mode 100644 index 0000000000..deebcffe29 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/inputbox/InputBox.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ InputBox +fun_str equ 'InputBox' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/lib/inputbox/__lib__.asm b/programs/develop/ktcc/trunk/lib/inputbox/__lib__.asm new file mode 100644 index 0000000000..eac1985673 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/inputbox/__lib__.asm @@ -0,0 +1,9 @@ +format ELF + +include '__lib__.inc' + +section '.text' + +public lib_name + +lib_name db 0x55, 0xAA, lib_name_str, 0 diff --git a/programs/develop/ktcc/trunk/lib/inputbox/__lib__.inc b/programs/develop/ktcc/trunk/lib/inputbox/__lib__.inc new file mode 100644 index 0000000000..d87c630bb6 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/inputbox/__lib__.inc @@ -0,0 +1,2 @@ +lib_name equ @inputbox.obj +lib_name_str equ '/sys/lib/inputbox.obj' \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/inputbox/make.bat b/programs/develop/ktcc/trunk/lib/inputbox/make.bat new file mode 100644 index 0000000000..1a12411771 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/inputbox/make.bat @@ -0,0 +1,5 @@ +fasm __lib__.asm +fasm InputBox.asm +kos32-ar -ru libinputbox.a *.o +del *.o +pause \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/sample/__lib__.asm b/programs/develop/ktcc/trunk/lib/sample/__lib__.asm new file mode 100644 index 0000000000..eac1985673 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/sample/__lib__.asm @@ -0,0 +1,9 @@ +format ELF + +include '__lib__.inc' + +section '.text' + +public lib_name + +lib_name db 0x55, 0xAA, lib_name_str, 0 diff --git a/programs/develop/ktcc/trunk/lib/sample/__lib__.inc b/programs/develop/ktcc/trunk/lib/sample/__lib__.inc new file mode 100644 index 0000000000..96b5a49c17 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/sample/__lib__.inc @@ -0,0 +1,2 @@ +lib_name equ @sample.obj +lib_name_str equ '/sys/lib/sample.obj' \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/sample/howto.txt b/programs/develop/ktcc/trunk/lib/sample/howto.txt new file mode 100644 index 0000000000..cfd9ed8851 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/sample/howto.txt @@ -0,0 +1,13 @@ +Create new library wrapper + +1. Redefine lib_name and lib_name_str in __lib__.inc +2. Create file for each symbol, basing on sample_symbol.asm and for each: +2.1. Redefine fun to *your_symbol_name* +2.2. Redefine fun_name to '*your_symbol_name*' (with quotes, this is ASCII string, no trailing zero need) +3. Change make.bat as appropriate + +ACHTUNG: lib_name need to be unique in project, this is why I started it with "@" and put "." into. +ACHTUNG: lib_name_str must be at least 5 symbols long, if is not, fix this adding padding to the path. + +Now you can create header file and declare extern variables pointers-to-functions, and then link your app with -llibname (put .a file in lib folder). +For examples of such header files, look at include/kos/inputbox.h, include/kos/console.h and include/kos/http.h. IMO, first one is the simplest. diff --git a/programs/develop/ktcc/trunk/lib/sample/make.bat b/programs/develop/ktcc/trunk/lib/sample/make.bat new file mode 100644 index 0000000000..4b82311b24 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/sample/make.bat @@ -0,0 +1,5 @@ +fasm __lib__.asm +fasm sample_symbol.asm +kos32-ar -ru libsample.a *.o +del *.o +pause \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/lib/sample/sample_symbol.asm b/programs/develop/ktcc/trunk/lib/sample/sample_symbol.asm new file mode 100644 index 0000000000..613ad69a91 --- /dev/null +++ b/programs/develop/ktcc/trunk/lib/sample/sample_symbol.asm @@ -0,0 +1,18 @@ +format ELF + +include "__lib__.inc" + +fun equ sample_symbol +fun_str equ 'sample_symbol' + +section '.text' + +fun_name db fun_str, 0 + +section '.data' + +extrn lib_name +public fun + +fun dd fun_name +lib dd lib_name diff --git a/programs/develop/ktcc/trunk/libc/include/kos/console.h b/programs/develop/ktcc/trunk/libc/include/kos/console.h new file mode 100644 index 0000000000..c7c95a608f --- /dev/null +++ b/programs/develop/ktcc/trunk/libc/include/kos/console.h @@ -0,0 +1,183 @@ +/* +This is adapded thunk for console.obj sys library +.h is equal to svn:\programs\develop\libraries\console\console_en.txt + +Adapted for tcc by Siemargl, 2016 +Adapted for dynamic API by Magomed Kostoev, 2020 (just copied this, actually =P) +*/ +#ifndef __dylibc__kos__console_h__ +#define __dylibc__kos__console_h__ + +#define cdecl __attribute__ ((cdecl)) +#define stdcall __attribute__ ((stdcall)) + +/* +console.obj exports the following functions +*/ +extern void stdcall (*con_init)(unsigned int wnd_width, unsigned int wnd_height, + unsigned int scr_width, unsigned int scr_height, const char* title); +/* Console initialization. Must be called only once. +wnd_width, wnd_height - width and height (in units of characters) of the visible +region; +scr_width, scr_height - width and height (in units of characters) of console; +Any of these four parameters can be set to -1 (=0xFFFFFFFF) +to use the library's default values; +title - console window's caption. */ + +extern void stdcall (*con_exit)(int bCloseWindow); +/* You should call this funstion at the end of the program. +If bCloseWindow is zero, the string "[Finished]" will be added to the caption of +the window and the console window will remain on the screen until the user +closes it. */ + +extern void stdcall (*con_set_title)(const char* title); +/* Set new window caption. */ + +extern void stdcall (*con_write_asciiz)(const char* str); +/* Display ASCIIZ-string to the console at the current position, shifting +the current position. */ + +extern void stdcall (*con_write_string)(const char* str, unsigned int length); +/* Similar to con_write_asciiz, but length of the string must be given as a +separate parameter */ + +extern int cdecl (*con_printf)(const char* format, ...); +/* Standard "printf" function from ANSI C. */ + +extern unsigned int stdcall (*con_get_flags)(void); +/* Get output flags. */ + +extern unsigned int stdcall (*con_set_flags)(unsigned int new_flags); +/* Set output flags. This function returns previous values. */ + +/* Flags (bitmask): */ +/* text color */ +#define CON_COLOR_BLUE 0x01 +#define CON_COLOR_GREEN 0x02 +#define CON_COLOR_RED 0x04 +#define CON_COLOR_BRIGHT 0x08 +/* background color */ +#define CON_BGR_BLUE 0x10 +#define CON_BGR_GREEN 0x20 +#define CON_BGR_RED 0x40 +#define CON_BGR_BRIGHT 0x80 +/* output controls */ +#define CON_IGNORE_SPECIALS 0x100 +/* if this flag is cleared, function interprets special characters: +10 ('\n') - next line +13 ('\r') - carriage return +8 ('\b') - backspace +9 ('\t') - tab +27 ('\033' = '\x1B') - the beginning of Esc-sequences; +otherwise, these characters will be displayed like ordinary characters. */ +/* Supported Esc-sequences: + Esc[;;m - choice of character attributes: + You can specify one, two or three codes in any order; + 0 = normal mode (white on black) + 1 = bright selection + 5 = bright background + 7 = inverse mode (black on white) + 30 = black characters + 31 = red characters + 32 = green characters + 33 = brown characters + 34 = blue characters + 35 = purple characters + 36 = turqoise characters + 37 = white characters + 40 = black background + 41 = red background + 42 = green background + 43 = brown background + 44 = blue background + 45 = purple background + 46 = turqoise background + 47 = white background + The following sequences appeared in version 5 of library: + Esc[2J - clear screen, move cursor to upper left corner + Esc[;H = Esc[;f - + move cursor to , + Esc[A - move cursor to lines up + Esc[B - move cursor to lines down + Esc[C - move cursor to positions right + Esc[D - move cursor to positions left +*/ +/* signal "console closed"; appeared in version 6; + ignored by con_set_flags */ +#define CON_WINDOW_CLOSED 0x200 +/* The default value for flags = 7. (grey text on black background) */ + +extern int stdcall (*con_get_font_height)(void); +/* Get the height of the font. */ + +extern int stdcall (*con_get_cursor_height)(void); +/* Get the height of the cursor. */ + +extern int stdcall (*con_set_cursor_height)(int new_height); +/* Set the height of the cursor. This function returns previous value. +An attempt to set the value out of the correct interval (from 0 to +font_height-1) is ignored. +Cursor with zero height isn't displayed. +Default value: - 15% from font height. */ + +extern int stdcall (*con_getch)(void); +/* Get one character from the keyboard. + +For normal characters function returns ASCII-code. For extended +characters (eg, Fx, and arrows), first function call returns 0 +and second call returns the extended code (similar to the DOS-function +input). Starting from version 7, after closing the console window, +this function returns 0. */ + +extern unsigned short stdcall (*con_getch2)(void); +/* Reads a character from the keyboard. Low byte contains the ASCII-code +(0 for extended characters), high byte - advanced code (like in BIOS +input functions). Starting from version 7, after closing the console +window, this function returns 0. */ + +extern int stdcall (*con_kbhit)(void); +/* Returns 1 if a key was pressed, 0 otherwise. To read pressed keys use +con_getch and con_getch2. Starting from version 6, after closing +the console window, this function returns 1. */ + +extern char* stdcall (*con_gets)(char* str, int n); +/* Reads a string from the keyboard. Reading is interrupted when got +"new line" character, or after reading the (n-1) characters (depending on +what comes first). In the first case the newline is also recorded in the +str. The acquired line is complemented by a null character. +Starting from version 6, the function returns a pointer to the entered +line if reading was successful, and NULL if the console window was closed. */ + +typedef int (stdcall * con_gets2_callback)(int keycode, char** pstr, int* pn, + int* ppos); + +extern char* stdcall (*con_gets2)(con_gets2_callback callback, char* str, int n); +/* Con_gets completely analogous, except that when the user +press unrecognized key, it calls the specified callback-procedure +(which may, for example, handle up / down for history and tab to enter +autocompletion). You should pass to the procedure: key code and three pointers +- to the string, to the maximum length and to the current position. +function may change the contents of string and may change the string +itself (for example, to reallocate memory for increase the limit), +maximum length, and position of the line - pointers are passed for it. +Return value: 0 = line wasn't changed 1 = line changed, you should +remove old string and display new, 2 = line changed, it is necessary +to display it; 3 = immediately exit the function. +Starting from version 6, the function returns a pointer to the entered +line with the successful reading, and NULL if the console window was closed. */ + +extern void stdcall (*con_cls)(); +/* Clear screen and set cursor at upper left corner. */ + + +extern void stdcall (*con_get_cursor_pos)(int* px, int* py); +/* Wrote current (x) coordinate of cursor to *px, and (y) to *py. */ + +extern void stdcall (*con_set_cursor_pos)(int x, int y); +/* Set the cursor position to the specified coordinates. If any of the +parameters beyond the relevant range (from 0 to 1 scr_width- +for x, from 0 to 1 for scr_height-y, scr_width scr_height and were asked if +call con_init), then the corresponding coordinate of the cursor does not change. +*/ + +#endif diff --git a/programs/develop/ktcc/trunk/libc/include/kos/http.h b/programs/develop/ktcc/trunk/libc/include/kos/http.h new file mode 100644 index 0000000000..79261197e9 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc/include/kos/http.h @@ -0,0 +1,139 @@ +/* + This is adapded thunk for console.obj sys library + .h is equal to svn:\programs\develop\libraries\http\http_en.txt + + Adapted for TCC's dynamic API by Magomed Kostoev, 2020 +*/ + +#ifndef __kos__http__h________ +#define __kos__http__h________ + +#define cdecl __attribute__ ((cdecl)) +#define stdcall __attribute__ ((stdcall)) + +// Bitflags for http_msg.flags +// status +#define HTTP_FLAG_HTTP11 1 << 0 +#define HTTP_FLAG_GOT_HEADER 1 << 1 +#define HTTP_FLAG_GOT_ALL_DATA 1 << 2 +#define HTTP_FLAG_CONTENT_LENGTH 1 << 3 +#define HTTP_FLAG_CHUNKED 1 << 4 +#define HTTP_FLAG_CONNECTED 1 << 5 + +// user options +#define HTTP_FLAG_KEEPALIVE 1 << 8 +#define HTTP_FLAG_STREAM 1 << 9 +#define HTTP_FLAG_REUSE_BUFFER 1 << 10 +#define HTTP_FLAG_BLOCK 1 << 11 + +// error +#define HTTP_FLAG_INVALID_HEADER 1 << 16 +#define HTTP_FLAG_NO_RAM 1 << 17 +#define HTTP_FLAG_SOCKET_ERROR 1 << 18 +#define HTTP_FLAG_TIMEOUT_ERROR 1 << 19 +#define HTTP_FLAG_TRANSFER_FAILED 1 << 20 + +/* +User flags: + +For the flag codes themselves, see http.inc file. + + FLAG_KEEPALIVE will keep the connection open after first GET/POST/.. so you can send a second request on the same TCP session. +In this case, the session must be closed manually when done by using the exported disconnect() function. + + FLAG_STREAM will force receive() to put the received content in a series of fixed size buffers, instead of everything in one big buffer. +This can be used for example to receive an internet radio stream, +but also to download larger files for which it does not make sense to put them completely in RAM first. + + FLAG_REUSE_BUFFER is to be used in combination with FLAG_STREAM and will make receive() function re-use the same buffer. +This, for example, can be used when downloading a file straight to disk. + + FLAG_BLOCK will make receive() function blocking. This is only to be used when receiving one file from a thread that has no other work. +If however, you want to receive multiple files, or do other things in the program mainloop, you should call the receive function periodically. +You may use system function 10 or 23 to wait for network event before calling one or more receive() functions. +*/ + +typedef struct http_msg_s { + unsigned socket; // socket on which the actual transfer happens + unsigned flags; // flags, reflects status of the transfer using bitflags + unsigned write_ptr; // internal use only (where to write new data in buffer) + unsigned buffer_length; // internal use only (number of available bytes in buffer) + unsigned chunk_ptr; // internal use only (where the next chunk begins) + unsigned timestamp; // internal use only (when last data was received) + unsigned status; // HTTP status + unsigned header_length; // length of HTTP header + void * content_ptr; // ptr to content + unsigned content_length; // total length of HTTP content + unsigned content_received; // number of currently received content bytes + char http_header[1]; +} http_msg; + +/* + url = pointer to ASCIIZ URL + identifier = identifier of previously opened connection (keep-alive), or 0 to open a new one. + flags = bit flags (see end of this document). + add_header = pointer to ASCIIZ additional header parameters, or null for none. + Every additional parameter must end with CR LF bytes, including the last line. + Initiates a HTTP connection, using 'GET' method. + Returns NULL on error, identifier otherwise. +*/ +extern http_msg * stdcall (*get)(const char *url, http_msg *identifier, unsigned flags, const char *add_header); + +/* + url = pointer to ASCIIZ URL + identifier = identifier of previously opened connection (keep-alive), or 0 to open a new one. + flags = bit flags (see end of this document). + add_header = pointer to ASCIIZ additional header parameters, or null for none. + Every additional parameter must end with CR LF bytes, including the last line. + Initiate a HTTP connection, using 'HEAD' method. + Returns NULL on error, identifier otherwise. +*/ +extern http_msg * stdcall (*head)(const char *url, http_msg *identifier, unsigned flags, const char *add_header); + +/* + url = pointer to ASCIIZ URL + identifier = identifier of previously opened connection (keep-alive), or 0 to open a new one. + flags = bit flags (see end of this document). + add_header = pointer to ASCIIZ additional header parameters, or null for none. + Every additional parameter must end with CR LF bytes, including the last line. + content-type = pointer to ASCIIZ string containing content type. + content-length = length of the content (in bytes). + Initiate a HTTP connection, using 'POST' method. + The content itself must be send to the socket (which you can find in the structure), + using system function 75, 6. + Returns 0 on error, identifier otherwise +*/ +extern http_msg * stdcall (*post)(const char *url, http_msg *identifier, unsigned flags, const char *add_header, + const char *content_type, unsigned content_length); + +/* + identifier = identifier which one of the previous functions returned + This procedure will handle all incoming data for a connection and place it in the buffer. + As long as the procedure expects more data, -1 is returned and the procedure must be called again. + When transfer is done, the procedure will return 0. + The receive procedure is non-blocking by default, but can be made to block by setting FLAG_BLOCK. + + The HTTP header is placed together with some flags and other attributes in the http_msg structure. + This structure is defined in http.inc (and not copied here because it might still change.) + The identifier used by the functions is actually a pointer to this structure. + In the dword named .flags, the library will set various bit-flags indicating the status of the process. + (When a transfer is done, one should check these bit-flags to find out if the transfer was error-free.) + The HTTP header is placed at the end of this structure. The content is placed in another buffer. + The dword .status contains the status code received from the server (e.g. 200 for OK). + In header_length you'll find the length of the header as soon as it has been received. + In content_ptr you'll find a pointer to the actual content. + In content_length you'll find the length of the content. + In content_received, you'll find the number of content bytes already received. +*/ +extern int stdcall (*receive)(http_msg *identifier); + +/* + identifier = identifier which one of the previous functions returned + dataptr = pointer to the data you want to send + datalength = length of the data to send (in bytes) + This procedure can be used to send data to the server (POST) + Returns number of bytes sent, -1 on error +*/ +extern int stdcall (*send)(http_msg *identifier, void *dataptr, unsigned datalength); + +#endif // __kos__http__h________ \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/libc/include/kos/inputbox.h b/programs/develop/ktcc/trunk/libc/include/kos/inputbox.h new file mode 100644 index 0000000000..1b2a6c2041 --- /dev/null +++ b/programs/develop/ktcc/trunk/libc/include/kos/inputbox.h @@ -0,0 +1,17 @@ +/* + This is wrapper for Inputbox.obj sys library + https://board.kolibrios.org/viewtopic.php?f=24&t=3767&sid=fd2ca95b24eec430db0c61d977f5d8ba#p71585 + + Adapted for TCC's dynamic API by Magomed Kostoev, 2020 +*/ + +#ifndef __KOS__INPUTBOX__H________ +#define __KOS__INPUTBOX__H________ + +#define cdecl __attribute__ ((cdecl)) +#define stdcall __attribute__ ((stdcall)) + +extern unsigned stdcall (*InputBox)(void* Buffer, char* Caption, char* Prompt, char* Default, + unsigned long Flags, unsigned long BufferSize, void* RedrawProc); + +#endif // __KOS__INPUTBOX__H________ diff --git a/programs/develop/ktcc/trunk/libc/start/start.asm b/programs/develop/ktcc/trunk/libc/start/start.asm index 920aa984db..33cfee0375 100644 --- a/programs/develop/ktcc/trunk/libc/start/start.asm +++ b/programs/develop/ktcc/trunk/libc/start/start.asm @@ -5,6 +5,9 @@ public start as '_start' ;extrn mf_init extrn main ;include 'debug2.inc' +include '..\..\..\..\..\proc32.inc' +include '..\..\..\..\..\macros.inc' +include '..\..\..\..\..\dll.inc' __DEBUG__=0 ;start_: @@ -12,7 +15,7 @@ virtual at 0 db 'MENUET01' ; 1. Magic number (8 bytes) dd 0x01 ; 2. Version of executable file dd start ; 3. Start address - dd 0x0 ; 4. Size of image +imgsz dd 0x0 ; 4. Size of image dd 0x100000 ; 5. Size of needed memory dd 0x100000 ; 6. Pointer to stack hparams dd 0x0 ; 7. Pointer to program arguments @@ -26,14 +29,7 @@ start: mov ebx,11 int 0x40 -;DEBUGF ' path "%s"\n params "%s"\n', .path, .params -; check for overflow -;; that not work -; mov al, [path+buf_len-1] -; or al, [params+buf_len-1] -; jnz .crash -; check if path written by OS - mov [argc], 0 + mov [argc], 0 mov eax, [hparams] test eax, eax jz .without_path @@ -90,25 +86,16 @@ start: jmp .parse .run: -;DEBUGF 'call main(%x, %x) with params:\n', [argc], argv -if __DEBUG__ = 1 - mov ecx, [argc] - @@: - lea esi, [ecx * 4 + argv-4] - DEBUGF '0x%x) "%s"\n', cx, [esi] - loop @b -end if + call load_imports push argv push [argc] call main .exit: -;DEBUGF 'Exit from prog\n'; xor eax,eax dec eax int 0x40 dd -1 .crash: -;DEBUGF 'E:buffer overflowed\n' jmp .exit ;============================ push_param: @@ -127,6 +114,96 @@ push_param: .dont_add: ret ;============================== + +;============================== +load_imports: +;============================== +;parameters +; none +;description +; imports must be located at end of image (but before BSS sections) +; the address of end of imports (next byte after imports) is located in imgsz +; look at each import from that address up to illegal import +; legal import is such that: +; first pointer points to procedure name +; and is smaller than imgsz +; second pointer points lo library name, starting with 0x55, 0xAA +; and is smaller than imgsz +; each library should be initialized as appropriate, once +; so as library is initialized, its name will be replaced 0x00 + mov ebx, [imgsz] ; byte after imports +.handle_next_import: + sub ebx, 4 ; ebx = pointer to pointer to library name + mov esi, dword[ebx] ; esi = pointer to library name + push ebx + push esi + call load_library ; eax = pointer to library exports + pop esi + pop ebx + test eax, eax + jz .done + sub ebx, 4 ; ebx = pointer to pointer to symbol name + push ebx + stdcall dll.GetProcAddress, eax, dword[ebx] + pop ebx + test eax, eax + jz .fail + mov dword[ebx], eax + jmp .handle_next_import +.done: + ret +.fail: + ret +;============================== + +;============================== +load_library: +;============================== +;parameters +; ebx: library name address +;description +; each library should be initialized as appropriate, once +; so as library is initialized, its name will be replaced 0x00 +; and 4 next bytes will be set to address of library + ; first two bytes of library name must be 0x55, 0xAA (is like a magic) + cld ; move esi further, not back + cmp esi, [imgsz] + ja .fail + lodsb ; al = first byte of library name + cmp al, 0x55 + jne .fail + lodsb ; al = second byte of library name + cmp al, 0xAA + jne .fail + lodsb ; al = third byte of library name (0x00 if the library is already loaded) + test al, al + jnz .load + lodsd ; if we here, then third byte is 0x00 => address of library is in next 4 bytes + ; now eax contains address of library + ret +.load: + dec esi ; we checked on 0 before, let's go back + mov eax, 68 + mov ebx, 19 + mov ecx, esi + int 0x40 ; eax = address of exports + mov byte[esi], 0 ; library is loaded, let's place 0 in first byte of name + mov [esi + 1], eax ; now next 4 bytes of library name are replaced by address of library + ; call lib_init + stdcall dll.GetProcAddress, eax, lib_init_str ; eax = address of lib_init + test eax, eax + jz .ret + stdcall dll.Init, eax +.ret: + mov eax, [esi + 1] ; put address of library into eax + ret +.fail: + mov eax, 0 + ret +;============================== + +lib_init_str db 'lib_init', 0 + public argc as '__argc' public params as '__argv' public path as '__path' diff --git a/programs/develop/ktcc/trunk/libc/start/start.old.asm b/programs/develop/ktcc/trunk/libc/start/start.old.asm new file mode 100644 index 0000000000..920aa984db --- /dev/null +++ b/programs/develop/ktcc/trunk/libc/start/start.old.asm @@ -0,0 +1,143 @@ +format ELF +section '.text' executable +public start +public start as '_start' +;extrn mf_init +extrn main +;include 'debug2.inc' +__DEBUG__=0 + +;start_: +virtual at 0 + db 'MENUET01' ; 1. Magic number (8 bytes) + dd 0x01 ; 2. Version of executable file + dd start ; 3. Start address + dd 0x0 ; 4. Size of image + dd 0x100000 ; 5. Size of needed memory + dd 0x100000 ; 6. Pointer to stack +hparams dd 0x0 ; 7. Pointer to program arguments +hpath dd 0x0 ; 8. Pointer to program path +end virtual + +start: +;DEBUGF 'Start programm\n' + ;init heap of memory + mov eax,68 + mov ebx,11 + int 0x40 + +;DEBUGF ' path "%s"\n params "%s"\n', .path, .params +; check for overflow +;; that not work +; mov al, [path+buf_len-1] +; or al, [params+buf_len-1] +; jnz .crash +; check if path written by OS + mov [argc], 0 + mov eax, [hparams] + test eax, eax + jz .without_path + mov eax, path + cmp word ptr eax, 32fh ; '/#3' UTF8 + jne .without_path + mov word ptr eax, 12fh ; '/#1' fix to CP866 +.without_path: + mov esi, eax + call push_param +; retrieving parameters + mov esi, params + xor edx, edx ; dl - идёт параметр(1) или разделители(0) + ; dh - символ с которого начался параметр (1 кавычки, 0 остальное) + mov ecx, 1 ; cl = 1 + ; ch = 0 просто ноль +.parse: + lodsb + test al, al + jz .run + test dl, dl + jnz .findendparam + ;{если был разделитель + cmp al, ' ' + jz .parse ;загружен пробел, грузим следующий символ + mov dl, cl ;начинается параметр + cmp al, '"' + jz @f ;загружены кавычки + mov dh, ch ;параметр без кавычек + dec esi + call push_param + inc esi + jmp .parse + + @@: + mov dh, cl ;параметр в кавычеках + call push_param ;если не пробел значит начинается какой то параметр + jmp .parse ;если был разделитель} + +.findendparam: + test dh, dh + jz @f ; без кавычек + cmp al, '"' + jz .clear + jmp .parse + @@: + cmp al, ' ' + jnz .parse + +.clear: + lea ebx, [esi - 1] + mov [ebx], ch + mov dl, ch + jmp .parse + +.run: +;DEBUGF 'call main(%x, %x) with params:\n', [argc], argv +if __DEBUG__ = 1 + mov ecx, [argc] + @@: + lea esi, [ecx * 4 + argv-4] + DEBUGF '0x%x) "%s"\n', cx, [esi] + loop @b +end if + push argv + push [argc] + call main +.exit: +;DEBUGF 'Exit from prog\n'; + xor eax,eax + dec eax + int 0x40 + dd -1 +.crash: +;DEBUGF 'E:buffer overflowed\n' + jmp .exit +;============================ +push_param: +;============================ +;parameters +; esi - pointer +;description +; procedure increase argc +; and add pointer to array argv +; procedure changes ebx + mov ebx, [argc] + cmp ebx, max_parameters + jae .dont_add + mov [argv+4*ebx], esi + inc [argc] +.dont_add: + ret +;============================== +public argc as '__argc' +public params as '__argv' +public path as '__path' + +section '.bss' +buf_len = 0x400 +max_parameters=0x20 +argc rd 1 +argv rd max_parameters +path rb buf_len +params rb buf_len + +;section '.data' +;include_debug_strings ; ALWAYS present in data section diff --git a/programs/develop/ktcc/trunk/samples/build_all.sh b/programs/develop/ktcc/trunk/samples/build_all.sh index 52120ef912..0b4aeab4d0 100644 --- a/programs/develop/ktcc/trunk/samples/build_all.sh +++ b/programs/develop/ktcc/trunk/samples/build_all.sh @@ -3,4 +3,5 @@ ../tcc consoleio.c /kolibrios/develop/tcc/lib/libck.a -o consoleio ../tcc files.c /kolibrios/develop/tcc/lib/libck.a -o files ../tcc winbasics.c /kolibrios/develop/tcc/lib/libck.a -o winbasics +../tcc dynamic.c -lconsole -lhttp -linputbox exit \ No newline at end of file diff --git a/programs/develop/ktcc/trunk/samples/dynamic.c b/programs/develop/ktcc/trunk/samples/dynamic.c new file mode 100644 index 0000000000..c85f688c8d --- /dev/null +++ b/programs/develop/ktcc/trunk/samples/dynamic.c @@ -0,0 +1,19 @@ +#include +#include +#include + +int main() { + con_set_title("Dynamicaly linked app"); + con_write_asciiz("Wait, I'll ask you... when I'll done to fetch one site"); + http_msg *h = get("http://boppan.org", 0, HTTP_FLAG_BLOCK, ""); + if (!receive(h)) { + con_printf("%s\n", h->content_ptr); + } else { + con_write_asciiz("Danmit! Can't access to the page."); + } + char buffer[256]; + InputBox(buffer, "Hay!", "How do you do?", "Everything sucks", 0, 256, 0); + con_write_asciiz(buffer); + con_exit(0); + return 0; +}