diff --git a/src/elf_link_common.c b/src/elf_link_common.c index 0be5b63885cdc583fd11fe9049c31b006f4e9a2a..b31d0057767ec300973a0af8c9f24738f25ec4c1 100644 --- a/src/elf_link_common.c +++ b/src/elf_link_common.c @@ -125,9 +125,13 @@ static void init_static_mode_symbol_change(elf_link_t *elf_link) append_symbol_mapping_by_name(elf_link, "exit", ef, "_exit"); } -// layout for vdso and out.ELF +// layout for vdso and app and ld.so +// ld.so | vvar | vdso | app +// xxK | 8K 4K 2M+ +// without ld.so // vvar | vdso | app // 8K 4K 2M+ + static unsigned long vdso_get_new_addr(Elf64_Sym *sym) { return 0UL - 4096UL + (unsigned long)sym->st_value; @@ -144,14 +148,14 @@ void init_vdso_symbol_addr(elf_link_t *elf_link) elf_file_t *vdso_ef = &elf_link->vdso_ef; // TODO: feature, probe AUX parameter - elf_link->direct_vdso_optimize = false; + //elf_link->direct_vdso_optimize = false; vdso_ef->file_name = "vdso"; vdso_ef->hdr = (Elf64_Ehdr *)0xfffff7ffb000UL; elf_parse_hdr(vdso_ef); if (vdso_ef->dynsym_sec == NULL) { - SI_LOG_DEBUG(".dynsym not exist\n"); + si_panic(".dynsym not exist\n"); } elf_show_dynsym(vdso_ef); @@ -173,6 +177,34 @@ void init_vdso_symbol_addr(elf_link_t *elf_link) return; } +void init_ld_symbol_addr(elf_link_t *elf_link) +{ + elf_file_t *ef = &elf_link->vdso_ef; + + // TODO: feature, probe AUX parameter + + ef->file_name = "ld.so"; + ef->hdr = (Elf64_Ehdr *)0xfffff7ffb000UL; + elf_parse_hdr(ef); + + if (ef->dynsym_sec == NULL) { + si_panic(".dynsym not exist\n"); + } + + elf_show_dynsym(ef); + + int sym_count = ef->dynsym_sec->sh_size / sizeof(Elf64_Sym); + Elf64_Sym *syms = (Elf64_Sym *)(((void *)ef->hdr) + ef->dynsym_sec->sh_offset); + for (int j = 0; j < sym_count; j++) { + Elf64_Sym *sym = &syms[j]; + char *name = elf_get_dynsym_name(ef, sym); + unsigned long symbol_addr = (unsigned long)ef->hdr + (unsigned long)sym->st_value; + append_symbol_mapping(elf_link, name, symbol_addr); + } + + return; +} + void init_symbol_mapping(elf_link_t *elf_link) { // Assume that ifunc function name is unique @@ -181,6 +213,9 @@ void init_symbol_mapping(elf_link_t *elf_link) init_static_mode_symbol_change(elf_link); init_hook_func_symbol_change(elf_link); + if (is_direct_call_optimize(elf_link) && is_static_nold_mode(elf_link)) { + init_ld_symbol_addr(elf_link); + } if (is_direct_vdso_optimize(elf_link) == true) { init_vdso_symbol_addr(elf_link); } diff --git a/src/elf_link_common.h b/src/elf_link_common.h index 3c264790ae00dff59d1e1e322a6655a941a35c97..63eda081c1c6582b658617223a400b6d1b5b1402 100644 --- a/src/elf_link_common.h +++ b/src/elf_link_common.h @@ -125,6 +125,11 @@ static inline bool is_static_nolibc_mode(elf_link_t *elf_link) return elf_link->link_mode == ELF_LINK_STATIC_NOLIBC; } +static inline bool is_static_nold_mode(elf_link_t *elf_link) +{ + return elf_link->link_mode == ELF_LINK_STATIC_NOLD; +} + static inline bool is_hook_func(elf_link_t *elf_link) { return elf_link->hook_func; diff --git a/src/elf_link_elf.c b/src/elf_link_elf.c index ae801a00f171cc02e08adf5204cb25d75963557d..683c819be89ba773c76c2498df452c41124522dc 100644 --- a/src/elf_link_elf.c +++ b/src/elf_link_elf.c @@ -88,7 +88,7 @@ int elf_link_set_mode(elf_link_t *elf_link, unsigned int mode) elf_link->direct_call_optimize = true; // TODO: feature, probe AUX parameter - elf_link->direct_vdso_optimize = false; + //elf_link->direct_vdso_optimize = false; if (elf_link->in_ef_nr != 0) { SI_LOG_ERR("set mode must before add elf file\n"); diff --git a/src/elf_read_elf.c b/src/elf_read_elf.c index 85849d32565d9393db91d80c94dcf4c8351634d6..ecc4e4f2502439d34b7753cf7f35c3fb2bd5bfe3 100644 --- a/src/elf_read_elf.c +++ b/src/elf_read_elf.c @@ -597,7 +597,7 @@ int elf_read_file(char *file_name, elf_file_t *ef, bool is_readonly) // ELF must have relocation sec = elf_find_section_by_name(ef, ".rela.text"); - if (sec == NULL) { + if ((sec == NULL) && is_readonly) { SI_LOG_ERR("ELF must have .rela.text, %s\n", file_name); return -1; } diff --git a/tests/test_simple/Makefile b/tests/test_simple/Makefile index a84b022688265390d710c5ddb86c62ac0470a472..04c4f7619adbc0709307dcdebf5ef650b7f3c0ec 100644 --- a/tests/test_simple/Makefile +++ b/tests/test_simple/Makefile @@ -32,14 +32,14 @@ simple_app: simple: simple_app clear @echo ===rto=== - $(SYSBOOST) --static $(TEST_APP) $(LIBC) + $(SYSBOOST) --static-nold $(TEST_APP) $(LIBC) readelf -W -a $(TEST_APP).rto > simple_app.rto.elf objdump -d $(TEST_APP).rto > simple_app.rto.asm @echo ===run=== $(TEST_APP).rto rto: - gdb --args $(SYSBOOST) --static $(TEST_APP) $(LIBC) + gdb --args $(SYSBOOST) --static-nold $(TEST_APP) $(LIBC) run: gdb --args $(TEST_APP).rto