From e0d42d991ca07837d09310933c8887e0b03af635 Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Sat, 20 Jan 2024 21:44:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D1=83=D0=BB=D0=B8=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D1=83=D1=8E=D1=82=20=D1=81=D1=82=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D1=87=D0=BD=D1=83=D1=8E=20=D0=B1=D0=B8=D0=B1=D0=BB=D0=B8=D0=BE?= =?UTF-8?q?=D1=82=D0=B5=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 5 + configs/limine.cfg | 5 +- modlib/lib/.gitignore | 1 + modlib/lib/build.sh | 17 +++ modlib/lib/modstd.c | 18 --- modlib/lib/system.c | 58 +++++++++ modlib/lib/tool.c | 243 ++++++++++++++++++++++++++++++++++++ modlib/modstd.h | 237 +++-------------------------------- modlib/system.h | 64 +++------- modules/cpubench/build.sh | 2 +- modules/helloworld/build.sh | 3 +- modules/imfs/build.sh | 2 +- modules/pci/build.sh | 4 +- modules/ps2/build.sh | 2 +- modules/simd/build.sh | 2 +- modules/tga/build.sh | 2 +- 16 files changed, 367 insertions(+), 298 deletions(-) create mode 100644 modlib/lib/.gitignore create mode 100644 modlib/lib/build.sh delete mode 100644 modlib/lib/modstd.c create mode 100644 modlib/lib/system.c create mode 100644 modlib/lib/tool.c diff --git a/build.sh b/build.sh index 64a6ed4..6994db8 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,10 @@ #!/bin/sh +cd modlib/lib/ +chmod +x build.sh +./build.sh +cd ../.. + cd modules/ mkdir -p bin dos2unix */*.sh diff --git a/configs/limine.cfg b/configs/limine.cfg index 6c7a13b..d0932cf 100644 --- a/configs/limine.cfg +++ b/configs/limine.cfg @@ -40,4 +40,7 @@ TERM_WALLPAPER=boot:///mod/boot.jpg MODULE_CMDLINE=[MOD]tga.ko MODULE_PATH=boot:///mod/imfs.ko - MODULE_CMDLINE=[MOD]imfs.ko \ No newline at end of file + MODULE_CMDLINE=[MOD]imfs.ko + + MODULE_PATH=boot:///mod/hello.ko + MODULE_CMDLINE=[MOD]hello.ko \ No newline at end of file diff --git a/modlib/lib/.gitignore b/modlib/lib/.gitignore new file mode 100644 index 0000000..32bcd55 --- /dev/null +++ b/modlib/lib/.gitignore @@ -0,0 +1 @@ +libmod.a \ No newline at end of file diff --git a/modlib/lib/build.sh b/modlib/lib/build.sh new file mode 100644 index 0000000..1fc2c67 --- /dev/null +++ b/modlib/lib/build.sh @@ -0,0 +1,17 @@ +#/bin/sh + +CC="gcc" +AR="ar" +ARCH_FLAGS="-ffreestanding -O0 -g -fPIC -static -nostdlib " + +if [ -d "../../sdk" ]; then + CC="../../sdk/bin/x86_64-elf-gcc" + AR="../../sdk/bin/x86_64-elf-ar" +fi + +mkdir -p bin + +$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c system.c -o bin/system.o +$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c tool.c -o bin/tool.o +$AR -rcs ../../modlib/lib/libmod.a ../../modlib/lib/bin/system.o ../../modlib/lib/bin/tool.o +ranlib ../../modlib/lib/libmod.a \ No newline at end of file diff --git a/modlib/lib/modstd.c b/modlib/lib/modstd.c deleted file mode 100644 index dd360c0..0000000 --- a/modlib/lib/modstd.c +++ /dev/null @@ -1,18 +0,0 @@ -/** - * modstd.c - * Стандартная библиотека модулей - * - * Вспомогательные функции для работы с модулями - * - */ - -#include - -int m_strcmp(const char *s1, const char *s2) { - while (*s1 == *s2) { - if (*s1 == '\0') { return 0; } - s1++; - s2++; - } - return *s1 - *s2; -} \ No newline at end of file diff --git a/modlib/lib/system.c b/modlib/lib/system.c new file mode 100644 index 0000000..20dd25b --- /dev/null +++ b/modlib/lib/system.c @@ -0,0 +1,58 @@ +/** + * system.c + * Системные вызовы модулей + * + * Основные функции для работы с функцияи системы + * + */ + +#include +#include + +void *(*alloc)(uint64_t size); +void (*free)(void *ptr); +void (*fb_printf)(char *str, ...); +module_info_t *(*get_module)(char *module_id); +framebuffer_t (*alloc_framebuffer)( ); +void (*free_framebuffer)(framebuffer_t *frame); +void (*exit)(int code); +int (*get_error)( ); +sys_info_t *(*get_info)( ); +uint64_t (*new_thread)(uint64_t func); +int (*delete_thread)(uint64_t thread_id); +time_t (*get_time)( ); +uint64_t offset; + +void init_env(env_t *loader_env) { + offset = loader_env->offset; + fb_printf = loader_env->fb_printf; + alloc = loader_env->alloc; + free = loader_env->free; + get_module = loader_env->get_module; + alloc_framebuffer = loader_env->alloc_framebuffer; + free_framebuffer = loader_env->free_framebuffer; + exit = loader_env->exit; + get_error = loader_env->get_error; + get_info = loader_env->get_info; + new_thread = loader_env->new_thread; + delete_thread = loader_env->delete_thread; + get_time = loader_env->get_time; +} + +void *realloc(void *addr, size_t size) { + if (size == 0) { + free(addr); + return NULL; + } + + if (addr == NULL) { return alloc(size); } + + void *new_addr = alloc(size); + + if (new_addr == NULL) { return NULL; } + + memcpy(new_addr, addr, size); + free(addr); + + return new_addr; +} \ No newline at end of file diff --git a/modlib/lib/tool.c b/modlib/lib/tool.c new file mode 100644 index 0000000..f49c183 --- /dev/null +++ b/modlib/lib/tool.c @@ -0,0 +1,243 @@ +/** + * tool.c + * Дополнительные функции + * + * Вспомогательные функции для работы с данными + * + */ + +#include +#include + +uint64_t strlen(char *str) { + uint64_t length = 0; + while (*str) { + length++; + str++; + } + return length; +} + +void strcpy(char *dest, char *src) { + size_t i = 0; + while (src[i] != '\0') { + dest[i] = src[i]; + i++; + } + dest[i] = '\0'; // добавляем завершающий нулевой символ +} + +size_t strspn(char *str, char *accept) { + size_t count = 0; + char *ptr = str; + char *acc; + + while (*ptr) { + acc = accept; + while (*acc) { + if (*ptr == *acc) { + count++; + break; + } + acc++; + } + if (*acc == '\0') break; + ptr++; + } + + return count; +} + +size_t strcspn(char *str, char *reject) { + size_t count = 0; + char *ptr = str; + char *r; + + while (*ptr) { + r = reject; + while (*r) { + if (*ptr == *r) { return count; } + r++; + } + count++; + ptr++; + } + + return count; +} + +char *strtok(char *str, char *delim) { + char *token = NULL; + char *next_token = NULL; + + if (str != NULL) { + token = str; + } else { + token = next_token; + } + + if (token == NULL) { return NULL; } + + token += strspn(token, delim); + + if (*token == '\0') { + next_token = NULL; + return NULL; + } + + next_token = token + strcspn(token, delim); + + if (*next_token != '\0') { + *next_token = '\0'; + next_token++; + } else { + next_token = NULL; + } + + return token; +} + +size_t strtol(char *str, char **endptr, int64_t base) { + size_t num = 0; + int64_t sign = 1; + + // Пропускаем пробелы в начале строки + while (*str == ' ') { str++; } + + // Проверяем знак числа + if (*str == '-') { + sign = -1; + str++; + } else if (*str == '+') { + str++; + } + + // Проверяем основание системы счисления + if (base == 0) { + // Автоопределение основания + if (*str == '0') { + str++; + if (*str == 'x' || *str == 'X') { + base = 16; // Шестнадцатеричная система счисления + str++; + } else { + base = 8; // Восьмеричная система счисления + } + } else { + base = 10; // Десятичная система счисления + } + } + + // Преобразование строки в число + while (*str != '\0') { + int64_t digit; + if (*str >= '0' && *str <= '9') { + digit = *str - '0'; + } else if (*str >= 'A' && *str <= 'Z') { + digit = *str - 'A' + 10; + } else if (*str >= 'a' && *str <= 'z') { + digit = *str - 'a' + 10; + } else { + break; // Некорректный символ - прерываем преобразование + } + + if (digit >= base) { + break; // Некорректная цифра - прерываем преобразование + } + + num = num * base + digit; + str++; + } + + if (endptr != NULL) { + //*endptr = (char *)str; // Указатель на символ, следующий за числом + } + + return num * sign; +} + +char *strchr(char *str, char c) { + // пройти по каждому символу строки + while (*str != '\0') { + // если символ найден, вернуть указатель на него + if (*str == c) { return (char *)str; } + str++; // переход к следующему символу + } + // символ не найден, вернуть NULL + return NULL; +} + +int strcmp(const char *s1, const char *s2) { + while (*s1 == *s2) { + if (*s1 == '\0') { return 0; } + s1++; + s2++; + } + return *s1 - *s2; +} + +char *trstr(char *str, char sym) { + size_t left, size = strlen(str); + for (left = 0x00U; left < size; left++) + if (str[left] == sym) break; + + size++; + left++; + + if (left < size) + size -= left; + else + left = 0x00U; + + char *res = alloc(size); + memcpy(res, str + left, size); + return res; +} + +char *strdup(char *str) { + size_t len = strlen(str) + 1; + char *dup = alloc(len); + + if (dup != NULL) { memcpy(dup, str, len); } + + return dup; +} + +size_t count_chars(char *str, char c) { + size_t count = 0; + size_t len = strlen(str); + + for (size_t i = 0; i < len; i++) { + if (str[i] == c) { count++; } + } + + return count; +} + +void memcpy(void *dest, void *src, size_t n) { + char *d = (char *)dest; + char *s = (char *)src; + + for (size_t i = 0; i < n; i++) { d[i] = s[i]; } +} + +void *memset(void *ptr, uint8_t n, size_t size) { + uint8_t *p = (uint8_t *)ptr; + for (size_t i = 0; i < size; i++) { p[i] = n; } + return ptr; +} + +void *memmove(void *dest, void *src, size_t n) { + char *d = (char *)dest; + const char *s = (const char *)src; + + if (d > s) { + // копирование с конца массива, чтобы предотвратить перекрытие + for (size_t i = n; i > 0; --i) { d[i - 1] = s[i - 1]; } + } else if (d < s) { + // копирование с начала массива + for (size_t i = 0; i < n; ++i) { d[i] = s[i]; } + } + + return dest; +} \ No newline at end of file diff --git a/modlib/modstd.h b/modlib/modstd.h index c456fff..594ea90 100644 --- a/modlib/modstd.h +++ b/modlib/modstd.h @@ -11,228 +11,19 @@ #ifndef MODSTD_H #define MODSTD_H -static uint64_t strlen(char *str) { - uint64_t length = 0; - while (*str) { - length++; - str++; - } - return length; -} - -static void strcpy(char *dest, char *src) { - size_t i = 0; - while (src[i] != '\0') { - dest[i] = src[i]; - i++; - } - dest[i] = '\0'; // добавляем завершающий нулевой символ -} - -static void memcpy(void *dest, void *src, size_t n) { - char *d = (char *)dest; - char *s = (char *)src; - - for (size_t i = 0; i < n; i++) { d[i] = s[i]; } -} - -static void *memset(void *ptr, uint8_t n, size_t size) { - uint8_t *p = (uint8_t *)ptr; - for (size_t i = 0; i < size; i++) { p[i] = n; } - return ptr; -} - -static size_t strspn(char *str, char *accept) { - size_t count = 0; - char *ptr = str; - char *acc; - - while (*ptr) { - acc = accept; - while (*acc) { - if (*ptr == *acc) { - count++; - break; - } - acc++; - } - if (*acc == '\0') break; - ptr++; - } - - return count; -} - -static size_t strcspn(char *str, char *reject) { - size_t count = 0; - char *ptr = str; - char *r; - - while (*ptr) { - r = reject; - while (*r) { - if (*ptr == *r) { return count; } - r++; - } - count++; - ptr++; - } - - return count; -} - -static char *strtok(char *str, char *delim) { - static char *token = NULL; - static char *next_token = NULL; - - if (str != NULL) { - token = str; - } else { - token = next_token; - } - - if (token == NULL) { return NULL; } - - token += strspn(token, delim); - - if (*token == '\0') { - next_token = NULL; - return NULL; - } - - next_token = token + strcspn(token, delim); - - if (*next_token != '\0') { - *next_token = '\0'; - next_token++; - } else { - next_token = NULL; - } - - return token; -} - -static size_t strtol(char *str, char **endptr, int64_t base) { - size_t num = 0; - int64_t sign = 1; - - // Пропускаем пробелы в начале строки - while (*str == ' ') { str++; } - - // Проверяем знак числа - if (*str == '-') { - sign = -1; - str++; - } else if (*str == '+') { - str++; - } - - // Проверяем основание системы счисления - if (base == 0) { - // Автоопределение основания - if (*str == '0') { - str++; - if (*str == 'x' || *str == 'X') { - base = 16; // Шестнадцатеричная система счисления - str++; - } else { - base = 8; // Восьмеричная система счисления - } - } else { - base = 10; // Десятичная система счисления - } - } - - // Преобразование строки в число - while (*str != '\0') { - int64_t digit; - if (*str >= '0' && *str <= '9') { - digit = *str - '0'; - } else if (*str >= 'A' && *str <= 'Z') { - digit = *str - 'A' + 10; - } else if (*str >= 'a' && *str <= 'z') { - digit = *str - 'a' + 10; - } else { - break; // Некорректный символ - прерываем преобразование - } - - if (digit >= base) { - break; // Некорректная цифра - прерываем преобразование - } - - num = num * base + digit; - str++; - } - - if (endptr != NULL) { - //*endptr = (char *)str; // Указатель на символ, следующий за числом - } - - return num * sign; -} - -static char *strchr(char *str, char c) { - // пройти по каждому символу строки - while (*str != '\0') { - // если символ найден, вернуть указатель на него - if (*str == c) { return (char *)str; } - str++; // переход к следующему символу - } - // символ не найден, вернуть NULL - return NULL; -} - -static void *memmove(void *dest, void *src, size_t n) { - char *d = (char *)dest; - const char *s = (const char *)src; - - if (d > s) { - // копирование с конца массива, чтобы предотвратить перекрытие - for (size_t i = n; i > 0; --i) { d[i - 1] = s[i - 1]; } - } else if (d < s) { - // копирование с начала массива - for (size_t i = 0; i < n; ++i) { d[i] = s[i]; } - } - - return dest; -} - -static char *trstr(char *str, char sym) { - size_t left, size = strlen(str); - for (left = 0x00U; left < size; left++) - if (str[left] == sym) break; - - size++; - left++; - - if (left < size) - size -= left; - else - left = 0x00U; - - char *res = alloc(size); - memcpy(res, str + left, size); - return res; -} - -static char *strdup(char *str) { - size_t len = strlen(str) + 1; - char *dup = alloc(len); - - if (dup != NULL) { memcpy(dup, str, len); } - - return dup; -} - -static size_t count_chars(char *str, char c) { - size_t count = 0; - size_t len = strlen(str); - - for (size_t i = 0; i < len; i++) { - if (str[i] == c) { count++; } - } - - return count; -} +uint64_t strlen(char *str); +void strcpy(char *dest, char *src); +size_t strspn(char *str, char *accept); +size_t strcspn(char *str, char *reject); +char *strtok(char *str, char *delim); +size_t strtol(char *str, char **endptr, int64_t base); +char *strchr(char *str, char c); +int strcmp(const char *s1, const char *s2); +char *trstr(char *str, char sym); +char *strdup(char *str); +size_t count_chars(char *str, char c); +void memcpy(void *dest, void *src, size_t n); +void *memset(void *ptr, uint8_t n, size_t size); +void *memmove(void *dest, void *src, size_t n); #endif // modstd.h diff --git a/modlib/system.h b/modlib/system.h index cc226c0..51c6e3b 100644 --- a/modlib/system.h +++ b/modlib/system.h @@ -9,57 +9,25 @@ #ifndef SYSTEM_H #define SYSTEM_H +#include #include -static void *(*alloc)(uint64_t size); -static void (*free)(void *ptr); -static void (*fb_printf)(char *str, ...); -static module_info_t *(*get_module)(char *module_id); -static framebuffer_t (*alloc_framebuffer)( ); -static void (*free_framebuffer)(framebuffer_t *frame); -static void (*exit)(int code); -static int (*get_error)( ); -static sys_info_t *(*get_info)( ); -static uint64_t (*new_thread)(uint64_t func); -static int (*delete_thread)(uint64_t thread_id); -static time_t (*get_time)( ); -static uint64_t offset; +extern void *(*alloc)(uint64_t size); +extern void (*free)(void *ptr); +extern void (*fb_printf)(char *str, ...); +extern module_info_t *(*get_module)(char *module_id); +extern framebuffer_t (*alloc_framebuffer)( ); +extern void (*free_framebuffer)(framebuffer_t *frame); +extern void (*exit)(int code); +extern int (*get_error)( ); +extern sys_info_t *(*get_info)( ); +extern uint64_t (*new_thread)(uint64_t func); +extern int (*delete_thread)(uint64_t thread_id); +extern time_t (*get_time)( ); +extern uint64_t offset; -#include - -static inline void init_env(env_t *loader_env) { - offset = loader_env->offset; - fb_printf = loader_env->fb_printf; - alloc = loader_env->alloc; - free = loader_env->free; - get_module = loader_env->get_module; - alloc_framebuffer = loader_env->alloc_framebuffer; - free_framebuffer = loader_env->free_framebuffer; - exit = loader_env->exit; - get_error = loader_env->get_error; - get_info = loader_env->get_info; - new_thread = loader_env->new_thread; - delete_thread = loader_env->delete_thread; - get_time = loader_env->get_time; -} - -static void *realloc(void *addr, size_t size) { - if (size == 0) { - free(addr); - return NULL; - } - - if (addr == NULL) { return alloc(size); } - - void *new_addr = alloc(size); - - if (new_addr == NULL) { return NULL; } - - memcpy(new_addr, addr, size); - free(addr); - - return new_addr; -} +void init_env(env_t *loader_env); +void *realloc(void *addr, size_t size); static inline void outb(uint16_t port, uint8_t val) { asm volatile("outb %0, %1" : : "a"(val), "Nd"(port)); diff --git a/modules/cpubench/build.sh b/modules/cpubench/build.sh index 7a38324..94e91bf 100755 --- a/modules/cpubench/build.sh +++ b/modules/cpubench/build.sh @@ -11,6 +11,6 @@ fi $CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o cpubench.o -$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none cpubench.o -o cpubench.ko +$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld cpubench.o -L../../modlib/lib/ -lmod -o cpubench.ko cp cpubench.ko ../bin/ echo "Сборка завершена, файл: cpubench.ko" diff --git a/modules/helloworld/build.sh b/modules/helloworld/build.sh index 3bc1afa..5b75c17 100755 --- a/modules/helloworld/build.sh +++ b/modules/helloworld/build.sh @@ -11,7 +11,8 @@ fi $CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o hello.o -$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none hello.o -o hello.ko +$CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c lol.c -o lol.o +$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld lol.o hello.o -L../../modlib/lib/ -lmod -o hello.ko cp hello.ko ../bin/ echo "Сборка завершена, файл: hello.ko" diff --git a/modules/imfs/build.sh b/modules/imfs/build.sh index a151d04..00fb4b4 100755 --- a/modules/imfs/build.sh +++ b/modules/imfs/build.sh @@ -11,7 +11,7 @@ fi $CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o imfs.o -$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none imfs.o -o imfs.ko +$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld imfs.o -L../../modlib/lib/ -lmod -o imfs.ko cp imfs.ko ../bin/ echo "Сборка завершена, файл: imfs.ko" diff --git a/modules/pci/build.sh b/modules/pci/build.sh index 4092c16..79c8aba 100755 --- a/modules/pci/build.sh +++ b/modules/pci/build.sh @@ -13,8 +13,8 @@ fi $CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o pci.o $CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c pci_data.c -o pci_data.o -$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none pci.o -o pci.ko -$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none pci_data.o -o pci_data.ko +$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld pci.o -L../../modlib/lib/ -lmod -o pci.ko +$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld pci_data.o -L../../modlib/lib/ -lmod -o pci_data.ko cp pci.ko ../bin/ cp pci_data.ko ../bin/ diff --git a/modules/ps2/build.sh b/modules/ps2/build.sh index 720a6f0..554ec6e 100755 --- a/modules/ps2/build.sh +++ b/modules/ps2/build.sh @@ -12,7 +12,7 @@ fi $CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o ps2.o -$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none ps2.o -o ps2.ko +$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld ps2.o -L../../modlib/lib/ -lmod -o ps2.ko cp ps2.ko ../bin/ diff --git a/modules/simd/build.sh b/modules/simd/build.sh index 30ef716..d4b333a 100755 --- a/modules/simd/build.sh +++ b/modules/simd/build.sh @@ -11,7 +11,7 @@ fi $CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o simd.o -$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none simd.o -o simd.ko +$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld simd.o -L../../modlib/lib/ -lmod -o simd.ko cp simd.ko ../bin/ echo "Сборка завершена, файл: simd.ko" diff --git a/modules/tga/build.sh b/modules/tga/build.sh index e2134f7..ebb0e87 100755 --- a/modules/tga/build.sh +++ b/modules/tga/build.sh @@ -11,7 +11,7 @@ fi $CC $ARCH_FLAGS -I../../modlib -finput-charset=UTF-8 -fexec-charset=cp1251 -c main.c -o tga.o -$CC $ARCH_FLAGS -T ../link.ld -Wl,--entry=init,--build-id=none tga.o -o tga.ko +$CC $ARCH_FLAGS -Wl,--entry=init,--build-id=none -T ../link.ld tga.o -L../../modlib/lib/ -lmod -o tga.ko cp boot.jpg ../bin/ cp boot.tga ../bin/