wip: elf64

This commit is contained in:
gbrochar 2024-04-03 14:45:17 +02:00
parent 65a9713d15
commit f0936e0d52
2 changed files with 225 additions and 41 deletions

View File

@ -24,7 +24,7 @@ int main(int ac, char **av) {
t_mapped_file mapped_file; t_mapped_file mapped_file;
ft_printf("sds", "file size: ", stat.st_size, "\n"); // ft_printf("sds", "file size: ", stat.st_size, "\n");
mapped_file.ptr = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0); mapped_file.ptr = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
mapped_file.size = stat.st_size; mapped_file.size = stat.st_size;
if (mapped_file.ptr != MAP_FAILED) { if (mapped_file.ptr != MAP_FAILED) {

264
src/nm.c
View File

@ -1,11 +1,14 @@
#include "ft_nm.h" #include "ft_nm.h"
int nm32(t_mapped_file mapped_file) { void ppp(Elf64_Sym sym, Elf64_Shdr sec);
(void)mapped_file; void print_section(Elf64_Shdr sec);
return FT_NM_SUCCESS; void print_symbol(Elf64_Sym sym);
}
char *get_sym_char(Elf64_Sym sym) { char *get_sym_char(Elf64_Sym sym, Elf64_Shdr sec) {
// ppp(sym, sec);
if ((sec.sh_flags & SHF_COMPRESSED) == SHF_COMPRESSED) {
return ("N");
}
if (sym.st_shndx == SHN_ABS) { if (sym.st_shndx == SHN_ABS) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) { if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("a"); return ("a");
@ -14,7 +17,127 @@ char *get_sym_char(Elf64_Sym sym) {
return ("A"); return ("A");
} }
} }
return ("T"); if (ELF64_ST_TYPE(sym.st_info) == STT_GNU_IFUNC) {
return ("i");
}
if (sec.sh_flags & SHF_EXECINSTR) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("t");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("T");
}
}
if (sec.sh_type == SHT_NOBITS) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("b");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("B");
}
}
if (sec.sh_type == SHT_PROGBITS && (sec.sh_flags & (SHF_ALLOC | SHF_WRITE)) == (SHF_ALLOC | SHF_WRITE)) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("d");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("D");
}
}
if (sec.sh_type == SHT_DYNAMIC && (sec.sh_flags & (SHF_ALLOC | SHF_WRITE)) == (SHF_ALLOC | SHF_WRITE)) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("d");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("D");
}
}
if (sec.sh_type == SHT_INIT_ARRAY && (sec.sh_flags & (SHF_ALLOC | SHF_WRITE)) == (SHF_ALLOC | SHF_WRITE)) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("d");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("D");
}
}
if (sec.sh_type == SHT_PREINIT_ARRAY && (sec.sh_flags & (SHF_ALLOC | SHF_WRITE)) == (SHF_ALLOC | SHF_WRITE)) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("d");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("D");
}
}
if (sec.sh_type == SHT_FINI_ARRAY && (sec.sh_flags & (SHF_ALLOC | SHF_WRITE)) == (SHF_ALLOC | SHF_WRITE)) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("d");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("D");
}
}
if (/*sec.sh_type == SHT_PROGBITS &&*/ sec.sh_flags & SHF_ALLOC) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("r");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("R");
}
}
if (sec.sh_type == SHT_NOTE && sec.sh_flags == SHF_ALLOC) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("r");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("R");
}
}
if (sym.st_shndx == SHN_COMMON) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("c");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("C");
}
}
if (sym.st_shndx == SHN_UNDEF) {
if (ELF64_ST_BIND(sym.st_info) == STB_LOCAL) {
return ("u");
}
else if (ELF64_ST_BIND(sym.st_info) == STB_GLOBAL) {
return ("U");
}
}
if (ELF64_ST_BIND(sym.st_info) == STB_WEAK) {
if (ELF64_ST_TYPE(sym.st_info) == STT_OBJECT) {
if (sec.sh_type == SHT_NULL) {
return ("v");
}
else {
return ("V");
}
} else {
if (sec.sh_type == SHT_NULL) {
return ("w");
}
else {
return ("W");
}
}
}
if (ELF64_ST_BIND(sym.st_info) == STB_WEAK) {
if (sec.sh_type == SHT_NULL) {
return ("w");
}
else {
print_symbol(sym);
print_section(sec);
return ("W");
}
}
// if section name starts with .debug....
// return ("N");
return ("n");
} }
int nm64(t_mapped_file mapped_file) { int nm64(t_mapped_file mapped_file) {
@ -22,23 +145,24 @@ int nm64(t_mapped_file mapped_file) {
if (get_header64(mapped_file, &header) == FT_NM_FAILURE) { if (get_header64(mapped_file, &header) == FT_NM_FAILURE) {
return FT_NM_FAILURE; return FT_NM_FAILURE;
} }
printf("Header:\n"); /* printf("Header:\n");
printf("Version: %d\n", header.e_version); printf("Version: %d\n", header.e_version);
printf("Entry point: %ld\n", header.e_entry); printf("Entry point: %ld\n", header.e_entry);
printf("Program header offset: "); printf("Program header offset: ");
fflush(stdout); fflush(stdout);
ft_printf("X", header.e_phoff); ft_printf("X", header.e_phoff);
ft_putchar('\n'); ft_putchar('\n');
printf("Section header offset: "); printf("Section header offset: ");
fflush(stdout); fflush(stdout);
ft_printf("X", header.e_shoff); ft_printf("X", header.e_shoff);
ft_putchar('\n'); ft_putchar('\n');
printf("Header size: %d\n", header.e_ehsize); printf("Header size: %d\n", header.e_ehsize);
printf("Program header entry size: %d\n", header.e_phentsize); printf("Program header entry size: %d\n", header.e_phentsize);
printf("Program header num: %d\n", header.e_phnum); printf("Program header num: %d\n", header.e_phnum);
printf("Section header entry size: %d\n", header.e_shentsize); printf("Section header entry size: %d\n", header.e_shentsize);
printf("Section header num: %d\n", header.e_shnum); printf("Section header num: %d\n", header.e_shnum);
printf("Section header string table index: %d\n", header.e_shstrndx); printf("Section header string table index: %d\n", header.e_shstrndx);
*/
/* /*
for (int i = 0; i < header.e_phnum; i++) { for (int i = 0; i < header.e_phnum; i++) {
uint64_t addr = header.e_phoff + header.e_phentsize * i; uint64_t addr = header.e_phoff + header.e_phentsize * i;
@ -50,7 +174,7 @@ int nm64(t_mapped_file mapped_file) {
ft_putstr(str); ft_putstr(str);
ft_putchar('\n'); ft_putchar('\n');
} }
*/ */
uint64_t addr = header.e_shoff + header.e_shentsize * header.e_shstrndx; uint64_t addr = header.e_shoff + header.e_shentsize * header.e_shstrndx;
//ft_printf("sX", "addr: ", addr); //ft_printf("sX", "addr: ", addr);
Elf64_Shdr shstrtb; Elf64_Shdr shstrtb;
@ -64,24 +188,50 @@ int nm64(t_mapped_file mapped_file) {
uint64_t addr2 = header.e_shoff + header.e_shentsize * sh.sh_link; uint64_t addr2 = header.e_shoff + header.e_shentsize * sh.sh_link;
Elf64_Shdr strtab; Elf64_Shdr strtab;
ft_memcpy(&strtab, mapped_file.ptr + addr2, header.e_shentsize); ft_memcpy(&strtab, mapped_file.ptr + addr2, header.e_shentsize);
ft_printf("sdsds", "SYMTAB Size: ", sh.sh_size, " Entity size: ", sh.sh_entsize, "\n"); // ft_printf("sdsds", "SYMTAB Size: ", sh.sh_size, " Entity size: ", sh.sh_entsize, "\n");
for (uint64_t j = 0; j < sh.sh_size; j += sh.sh_entsize) { for (uint64_t j = sh.sh_entsize; j < sh.sh_size; j += sh.sh_entsize) {
Elf64_Sym sym; Elf64_Sym sym;
Elf64_Shdr sec;
ft_memcpy(&sym, mapped_file.ptr + sh.sh_offset + j, sh.sh_entsize); ft_memcpy(&sym, mapped_file.ptr + sh.sh_offset + j, sh.sh_entsize);
char *str = ft_strdup(mapped_file.ptr + strtab.sh_offset + sym.st_name); // printf("st_shndx: %d\n", sym.st_shndx);
//if (str[ft_strlen(str) - 1] == 'c') { if (sym.st_shndx < header.e_shnum) {
printf("st_name: %d\n", sym.st_name); ft_memcpy(&sec, mapped_file.ptr + header.e_shoff + header.e_shentsize * sym.st_shndx, header.e_shentsize);
printf("st_info: %d\n", sym.st_info);
printf("st_other: %d\n", sym.st_other);
printf("st_shndx: %d\n", sym.st_shndx);
printf("st_value: %ld\n", sym.st_value);
printf("st_size: %ld\n", sym.st_size);
//}
if (sym.st_value) {
ft_printf("X s ss", sym.st_value, get_sym_char(sym), str, "\n");
} else {
ft_printf("P s ss", get_sym_char(sym), mapped_file.ptr + strtab.sh_offset + sym.st_name, "\n");
} }
char *str;
if (sym.st_name) {
str = ft_strdup(mapped_file.ptr + strtab.sh_offset + sym.st_name);
}
else {
//printf("good\n");
Elf64_Shdr shdr;
//print_symbol(sym);
if (sym.st_shndx != SHN_ABS) {
ft_memcpy(&shdr, mapped_file.ptr + header.e_shoff + header.e_shentsize * sym.st_shndx, header.e_shentsize);
//print_section(shdr);
//ft_printf("sxs", "sh string table ", shstrtb.sh_offset, "\n");
str = ft_strdup(mapped_file.ptr + shstrtb.sh_offset + shdr.sh_name);
//str = ft_strdup("TOTOTOTOTO");
//str = ft_strdup(mapped_file.ptr + shdr.sh_offset + sec.sh_name);
} else {
str = ft_strdup("");
}
}
//if (str[ft_strlen(str) - 1] == 'c') {
/*
*/
//}
char *sym_char = ft_strdup(get_sym_char(sym, sec));
if (sym.st_value) {
ft_printf("X s ss", sym.st_value, sym_char, str, "\n");
} else {
if (ft_strcmp(sym_char, "U") && ft_strcmp(sym_char, "w") && ft_strcmp(sym_char, "v")) {
ft_printf("X s ss", sym.st_value, sym_char, str, "\n");
} else {
//ft_printf("P s ss", sym_char, mapped_file.ptr + strtab.sh_offset + sym.st_name, "\n");
ft_printf("P s ss", sym_char, str, "\n");
}
}
fflush(stdout);
} }
} }
/*ft_printf("X", sh.sh_offset); /*ft_printf("X", sh.sh_offset);
@ -90,10 +240,44 @@ int nm64(t_mapped_file mapped_file) {
ft_putchar('\n');*/ ft_putchar('\n');*/
char *str = ft_strdup(mapped_file.ptr + shstrtb.sh_offset + sh.sh_name); char *str = ft_strdup(mapped_file.ptr + shstrtb.sh_offset + sh.sh_name);
//ft_putstr(str); //ft_putstr(str);
ft_printf("x x x ss", sh.sh_name, sh.sh_offset, addr, str, "\n"); // ft_printf("x x x ss", sh.sh_name, sh.sh_offset, addr, str, "\n");
free(str); free(str);
//ft_putchar('\n'); //ft_putchar('\n');
} }
return FT_NM_SUCCESS; return FT_NM_SUCCESS;
} }
void print_symbol(Elf64_Sym sym) {
printf("st_name: %d\n", sym.st_name);
printf("st_info: %d\n", sym.st_info);
printf("st_other: %d\n", sym.st_other);
printf("st_shndx: %d\n", sym.st_shndx);
// printf("st_value: %ld\n", sym.st_value);
// printf("st_size: %ld\n", sym.st_size);
fflush(stdout);
}
void print_section(Elf64_Shdr sec) {
printf("sh_name : %d\n", sec.sh_name);
printf("sh_type : %d\n", sec.sh_type);
printf("sh_flags : %ld\n", sec.sh_flags);
// printf("sh_addr : %ld\n", sec.sh_addr);
// printf("sh_offset : %ld\n", sec.sh_offset);
// printf("sh_size : %ld\n", sec.sh_size);
printf("sh_link : %d\n", sec.sh_link);
printf("sh_info : %d\n", sec.sh_info);
// printf("sh_addralign : %ld\n", sec.sh_addralign);
// printf("sh_entsize : %ld\n", sec.sh_entsize);
fflush(stdout);
}
int nm32(t_mapped_file mapped_file) {
(void)mapped_file;
return FT_NM_SUCCESS;
}
void ppp(Elf64_Sym sym, Elf64_Shdr sec) {
print_symbol(sym);
print_section(sec);
}