From 39f0f75bf4fc2747c6854fe86fe42d8415c416f4 Mon Sep 17 00:00:00 2001 From: tracer-ysyx Date: Sun, 17 Mar 2024 00:39:11 +0800 Subject: [PATCH] =?UTF-8?q?>=20compile=20NEMU=20ysyx=5F22040000=20?= =?UTF-8?q?=E6=9D=8E=E5=BF=83=E6=9D=A8=20Linux=20calcite=206.6.19=20#1-Nix?= =?UTF-8?q?OS=20SMP=20PREEMPT=5FDYNAMIC=20Fri=20Mar=20=201=2012:35:11=20UT?= =?UTF-8?q?C=202024=20x86=5F64=20GNU/Linux=20=2000:39:11=20=20up=20=2010:1?= =?UTF-8?q?4,=20=202=20users,=20=20load=20average:=200.97,=200.70,=200.60?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nemu/src/utils/elf-parser.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/nemu/src/utils/elf-parser.c b/nemu/src/utils/elf-parser.c index 67b6d0f..77e5892 100644 --- a/nemu/src/utils/elf-parser.c +++ b/nemu/src/utils/elf-parser.c @@ -1,3 +1,4 @@ +#include #include #include @@ -16,6 +17,8 @@ void init_elf(const char *path) { FAILED_GOTO(failed_nosym, fseek(elf_file, header.e_shoff, SEEK_SET) != 0); FAILED_GOTO(failed_nosym, fread(section_header, header.e_shentsize, header.e_shnum, elf_file) <= 0); + char *shstrtab = calloc(1, section_header[header.e_shstrndx].sh_size); + Elf32_Shdr *symtab = NULL, *strtab = NULL; for(int i = 0; i < header.e_shnum; i++) { psh = section_header + i; @@ -26,12 +29,16 @@ void init_elf(const char *path) { strtab = psh; printf("strtab: %u %u\n", strtab->sh_size, strtab->sh_offset); } + FAILED_GOTO(failed_shstrtab, fseek(elf_file, section_header[header.e_shstrndx].sh_offset, SEEK_SET) != 0); + FAILED_GOTO(failed_shstrtab, fread(shstrtab, sizeof(Elf32_Sym), section_header[header.e_shstrndx].sh_size, elf_file) <= 0); + printf("%s", shstrtab); // if(symtab && strtab) break; } int sym_length = symtab->sh_size / sizeof(Elf32_Sym); Elf32_Sym *sym = calloc(sym_length, sizeof(Elf32_Sym)); + FAILED_GOTO(failed_nosym, sym == NULL); 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); for(int j = 0; j < sym_length; j++) { @@ -46,6 +53,8 @@ void init_elf(const char *path) { return; failed: free(sym); +failed_shstrtab: + free(shstrtab); failed_nosym: Error("Failed reading elf file"); }