> compile NEMU
ysyx_22040000 李心杨 Linux calcite 6.6.19 #1-NixOS SMP PREEMPT_DYNAMIC Fri Mar 1 12:35:11 UTC 2024 x86_64 GNU/Linux 17:38:26 up 4:44, 2 users, load average: 0.67, 0.30, 0.25
This commit is contained in:
parent
be9ae806d9
commit
5aee73e34d
1 changed files with 18 additions and 13 deletions
|
@ -28,13 +28,12 @@ const char *get_func_name(vaddr_t addr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_elf(const char *path) {
|
void init_elf(const char *path) {
|
||||||
bool success = false;
|
|
||||||
FILE *elf_file = fopen(path, "rb");
|
FILE *elf_file = fopen(path, "rb");
|
||||||
Elf32_Ehdr header;
|
Elf32_Ehdr header;
|
||||||
Elf32_Shdr section_header[200], *psh;
|
Elf32_Shdr section_header[200], *psh;
|
||||||
|
|
||||||
func_table = (func_t *)calloc(func_table_size, sizeof(func_t));
|
func_table = (func_t *)calloc(func_table_size, sizeof(func_t));
|
||||||
FAILED_GOTO(failed_nosym, func_table == NULL);
|
assert(func_table);
|
||||||
|
|
||||||
FAILED_GOTO(failed_nosym, fread(&header, sizeof(Elf32_Ehdr), 1, elf_file) <= 0);
|
FAILED_GOTO(failed_nosym, fread(&header, sizeof(Elf32_Ehdr), 1, elf_file) <= 0);
|
||||||
FAILED_GOTO(failed_nosym, fseek(elf_file, header.e_shoff, SEEK_SET) != 0);
|
FAILED_GOTO(failed_nosym, fseek(elf_file, header.e_shoff, SEEK_SET) != 0);
|
||||||
|
@ -56,7 +55,7 @@ void init_elf(const char *path) {
|
||||||
|
|
||||||
int sym_length = symtab->sh_size / sizeof(Elf32_Sym);
|
int sym_length = symtab->sh_size / sizeof(Elf32_Sym);
|
||||||
Elf32_Sym *sym = calloc(sym_length, sizeof(Elf32_Sym));
|
Elf32_Sym *sym = calloc(sym_length, sizeof(Elf32_Sym));
|
||||||
FAILED_GOTO(failed_nosym, sym == NULL);
|
assert(sym);
|
||||||
FAILED_GOTO(failed, fseek(elf_file, symtab->sh_offset, SEEK_SET) != 0);
|
FAILED_GOTO(failed, fseek(elf_file, symtab->sh_offset, SEEK_SET) != 0);
|
||||||
FAILED_GOTO(failed, fread(sym, sizeof(Elf32_Sym), sym_length, elf_file) <= 0);
|
FAILED_GOTO(failed, fread(sym, sizeof(Elf32_Sym), sym_length, elf_file) <= 0);
|
||||||
|
|
||||||
|
@ -79,17 +78,23 @@ void init_elf(const char *path) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qsort(func_table, func_table_len, sizeof(func_t), cmp_func_t);
|
qsort(func_table, func_table_len, sizeof(func_t), cmp_func_t);
|
||||||
success = true;
|
goto success;
|
||||||
|
|
||||||
|
success:
|
||||||
|
free(sym);
|
||||||
|
free(shstrtab);
|
||||||
|
return;
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
// for(int i = 0; i < func_table_len; i++) {
|
free(sym);
|
||||||
// func_t *f = &func_table[i];
|
|
||||||
// if(f->name) { free(f->name); }
|
|
||||||
// }
|
|
||||||
// free(func_table);
|
|
||||||
// free(sym);
|
|
||||||
failed_shstrtab:
|
failed_shstrtab:
|
||||||
// free(shstrtab);
|
free(shstrtab);
|
||||||
failed_nosym:
|
failed_nosym:
|
||||||
if(success) return;
|
for(int i = 0; i < func_table_len; i++) {
|
||||||
else Error("Failed reading elf file");
|
func_t *f = &func_table[i];
|
||||||
|
if(f->name) { free(f->name); }
|
||||||
|
}
|
||||||
|
free(func_table);
|
||||||
|
Error("Failed reading elf file");
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue