Динамическая линковка символов [1/3]

This commit is contained in:
Aren 2024-04-30 13:34:47 +03:00
parent 40c1604109
commit 230eecc911
4 changed files with 56 additions and 3 deletions

View File

@ -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; // Целочисленное длинное слово без знака

View File

@ -1,3 +1,3 @@
#define VERSION_MAJOR 0
#define VERSION_MINOR 2
#define VERSION_BUILD 58
#define VERSION_BUILD 94

View File

@ -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");

View File

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