From 59192ce21a13658054a25e44f7913564178b34c7 Mon Sep 17 00:00:00 2001 From: tracer-ics2023 Date: Wed, 11 Sep 2024 00:36:52 +0800 Subject: [PATCH] =?UTF-8?q?>=20=20compile=20NEMU=20221220000=20=E5=BC=A0?= =?UTF-8?q?=E4=B8=89=20Linux=20zzy=205.15.146.1-microsoft-standard-WSL2=20?= =?UTF-8?q?#1=20SMP=20Thu=20Jan=2011=2004:09:03=20UTC=202024=20x86=5F64=20?= =?UTF-8?q?x86=5F64=20x86=5F64=20GNU/Linux=20=2000:36:51=20up=205=20days,?= =?UTF-8?q?=2012:45,=20=203=20users,=20=20load=20average:=200.59,=200.54,?= =?UTF-8?q?=200.54?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nemu/src/monitor/elf.c | 44 ++++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/nemu/src/monitor/elf.c b/nemu/src/monitor/elf.c index 8cb2526..8f904a6 100644 --- a/nemu/src/monitor/elf.c +++ b/nemu/src/monitor/elf.c @@ -75,41 +75,43 @@ void init_elf(const char* elf_file) { assert(ret == 1); // get symbol table and string table - Elf_Sym *psymt = NULL; - char* pstrt = NULL; - size_t symt_len = 0, strt_sz = 0; + size_t symt_len = 0; + size_t symt_size = 0, symt_offset = 0; + size_t strt_size = 0, strt_offset = 0; for (int i = 0; i < ehdr.e_shnum; i++) { if (shdr[i].sh_type == SHT_SYMTAB) { assert(shdr[i].sh_size % sizeof(Elf_Sym) == 0); symt_len = shdr[i].sh_size / shdr[i].sh_entsize; - Elf_Sym sym[symt_len]; - fseek(fp, shdr[i].sh_offset, SEEK_SET); - ret = fread(sym, shdr[i].sh_size, 1, fp); - assert(ret == 1); - psymt = sym; + symt_offset = shdr[i].sh_offset; + symt_size = shdr[i].sh_size; // Log("SYMTAB %ld, %08x %06x %06x", symt_len, shdr[i].sh_addr, shdr[i].sh_offset, shdr[i].sh_size); } else if (shdr[i].sh_type == SHT_STRTAB && i != ehdr.e_shstrndx) { - strt_sz = shdr[i].sh_size; - char buffer[strt_sz]; - fseek(fp, shdr[i].sh_offset, SEEK_SET); - ret = fread(buffer, strt_sz, 1, fp); - assert(ret == 1); - pstrt = buffer; + strt_size = shdr[i].sh_size; + strt_offset = shdr[i].sh_offset; // Log("SHT_STRTAB %d, %08x %06x %06x", ehdr.e_shstrndx, shdr[i].sh_addr, shdr[i].sh_offset, shdr[i].sh_size); } } + Elf_Sym symt[symt_len]; + fseek(fp, symt_offset, SEEK_SET); + ret = fread(symt, symt_size, 1, fp); + assert(ret == 1); + + char buffer[strt_size]; + fseek(fp, strt_offset, SEEK_SET); + ret = fread(buffer, strt_size, 1, fp); + assert(ret == 1); // filling ftrace - assert(psymt != NULL && pstrt != NULL); for (int i = 0; i < symt_len; i ++) { - Log("%3d: %08x "FMT_WORD" "FMT_WORD"", i, psymt[i].st_value, psymt[i].st_size, psymt[i].st_name); - if (ELF_ST_TYPE(psymt[i].st_info) == STT_FUNC) { + Log("%3d: %08x "FMT_WORD" "FMT_WORD"", i, symt[i].st_value, symt[i].st_size, symt[i].st_name); + if (ELF_ST_TYPE(symt[i].st_info) == STT_FUNC) { // Warning due to elf_ftrace is global variable so you don't need to set '\0' in the end - strncpy(elf_ftrace[elf_ftrace_size].fname, pstrt + psymt[i].st_name, + strncpy(elf_ftrace[elf_ftrace_size].fname, buffer + symt[i].st_name, sizeof(elf_ftrace[0].fname) - 1); - elf_ftrace[elf_ftrace_size].start = psymt[i].st_value; - elf_ftrace[elf_ftrace_size].size = psymt[i].st_size; - elf_ftrace[elf_ftrace_size].end = psymt[i].st_value + psymt[i].st_size - 1; + elf_ftrace[elf_ftrace_size].start = symt[i].st_value; + elf_ftrace[elf_ftrace_size].size = symt[i].st_size; + elf_ftrace[elf_ftrace_size].end = elf_ftrace[elf_ftrace_size].start + \ + elf_ftrace[elf_ftrace_size].size - 1; elf_ftrace_size ++; } }