> compile NEMU

221220000 张三
Linux zzy 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
 00:36:51 up 5 days, 12:45,  3 users,  load average: 0.59, 0.54, 0.54
This commit is contained in:
tracer-ics2023
2024-09-11 00:36:52 +08:00
committed by zzy
parent 6db0ebb442
commit 59192ce21a

View File

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