mirror of
https://github.com/0Nera/BMOSP.git
synced 2024-11-25 09:59:38 +03:00
Динамическая линковка символов [1/3]
This commit is contained in:
parent
40c1604109
commit
230eecc911
@ -25,6 +25,24 @@
|
||||
#define ELFMAG3 'F'
|
||||
#define SHT_SYMTAB 2
|
||||
|
||||
#define STT_NOTYPE 0 // Тип символа не указан
|
||||
#define STT_OBJECT 1 // Символ является объектом данных
|
||||
#define STT_FUNC 2 // Символ является объектом кода
|
||||
#define STT_SECTION 3 // Символ связан с разделом
|
||||
#define STT_FILE 4 // Имя символа является именем файла
|
||||
#define STT_COMMON 5 // Символ является общим объектом данных
|
||||
#define STT_TLS 6 // Символ является объектом данных локального потока
|
||||
#define STT_NUM 7 // Количество определенных типов.
|
||||
#define STT_GNU_IFUNC 10 // Символ является объектом непрямого кода
|
||||
|
||||
#define ELF32_ST_BIND(val) (((unsigned char)(val)) >> 4)
|
||||
#define ELF32_ST_TYPE(val) ((val)&0xf)
|
||||
#define ELF32_ST_INFO(bind, type) (((bind) << 4) + ((type)&0xf))
|
||||
|
||||
#define ELF64_ST_BIND(val) ELF32_ST_BIND(val)
|
||||
#define ELF64_ST_TYPE(val) ELF32_ST_TYPE(val)
|
||||
#define ELF64_ST_INFO(bind, type) ELF32_ST_INFO((bind), (type))
|
||||
|
||||
typedef uint64_t elf64_addr_t; // Адрес
|
||||
typedef uint64_t elf64_offset_t; // Смещение
|
||||
typedef uint64_t elf64_xword_t; // Целочисленное длинное слово без знака
|
||||
|
@ -1,3 +1,3 @@
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 2
|
||||
#define VERSION_BUILD 58
|
||||
#define VERSION_BUILD 94
|
||||
|
31
kernel/elf.c
31
kernel/elf.c
@ -76,6 +76,10 @@ void *elf_entry(void *module_bin) {
|
||||
return (void *)((uint64_t)elf_header->e_entry + (uint64_t)module_bin);
|
||||
}
|
||||
|
||||
void import_test( ) {
|
||||
LOG("123");
|
||||
}
|
||||
|
||||
void *elf_parse(elf64_header_t *head) {
|
||||
elf64_section_header_t *symtab = NULL;
|
||||
|
||||
@ -85,7 +89,7 @@ void *elf_parse(elf64_header_t *head) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
LOG("Точка входа: 0x%x\n", head->e_entry);
|
||||
// LOG("Точка входа: 0x%x\n", head->e_entry);
|
||||
|
||||
elf64_section_header_t *symtab_section = NULL;
|
||||
char *string_table = NULL;
|
||||
@ -106,7 +110,30 @@ void *elf_parse(elf64_header_t *head) {
|
||||
int num_symbols = symtab_section->sh_size / symtab_section->sh_entsize;
|
||||
for (int i = 0; i < num_symbols; i++) {
|
||||
elf64_sym_t *sym = elf64_get_symval(head, symtab_section - elf64_sheader(head), i);
|
||||
if (sym) { LOG("%6u %8x %6x %s\n", i, sym->st_value, sym->st_size, string_table + sym->st_name); }
|
||||
if (sym) {
|
||||
LOG("%6u %8x %6x %18s ", i, sym->st_value, sym->st_size, string_table + sym->st_name);
|
||||
switch (ELF64_ST_TYPE(sym->st_info)) {
|
||||
case STT_NOTYPE: log_printf("без типа\n"); break;
|
||||
case STT_OBJECT:
|
||||
log_printf("объект данных\n");
|
||||
if (!(string_table + sym->st_name)) { break; }
|
||||
// log_printf("%u\n", tool_strcmp(string_table + sym->st_name, "import_test"));
|
||||
if (tool_strcmp(string_table + sym->st_name, "import_test") == 0) {
|
||||
log_printf("0x%x\n", head + sym->st_value);
|
||||
void (*imp)( ) = (void *)head + sym->st_value;
|
||||
*imp = &import_test;
|
||||
}
|
||||
break;
|
||||
case STT_FUNC: log_printf("объект кода\n"); break;
|
||||
case STT_SECTION: log_printf("символ раздела\n"); break;
|
||||
case STT_FILE: log_printf("имя файла\n"); break;
|
||||
case STT_COMMON: log_printf("общий объект данных\n"); break;
|
||||
case STT_TLS: log_printf("объект данных локального потока\n"); break;
|
||||
case STT_NUM: log_printf("количество определенных типов\n"); break;
|
||||
case STT_GNU_IFUNC: log_printf("объект непрямого кода\n"); break;
|
||||
default: log_printf("???\n"); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
LOG("Таблица символов не найдена!\n");
|
||||
|
@ -101,6 +101,14 @@ void tool_reverse_str(char *str) {
|
||||
}
|
||||
}
|
||||
|
||||
int tool_strcmp(const char *s1, const char *s2) {
|
||||
while (*s1 && (*s1 == *s2)) {
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
return *(const unsigned char *)s1 - *(const unsigned char *)s2;
|
||||
}
|
||||
|
||||
// Преобразование целого числа "i" в системе счисления "base" в строку "buf"
|
||||
void tool_int_to_str(int64_t i, uint8_t base, char *buf) {
|
||||
bool negative = false;
|
||||
|
Loading…
Reference in New Issue
Block a user