Lines Matching refs:lte
243 arch_plt_sym_val(struct ltelf *lte, size_t ndx, GElf_Rela *rela) in arch_plt_sym_val() argument
245 if (lte->ehdr.e_machine == EM_PPC && lte->arch.secure_plt) { in arch_plt_sym_val()
246 assert(lte->arch.plt_stub_vma != 0); in arch_plt_sym_val()
247 return lte->arch.plt_stub_vma + PPC_PLT_STUB_SIZE * ndx; in arch_plt_sym_val()
249 } else if (lte->ehdr.e_machine == EM_PPC) { in arch_plt_sym_val()
255 } else if (reloc_is_irelative(lte->ehdr.e_machine, rela)) { in arch_plt_sym_val()
263 if (arch_translate_address(lte, res_addr, &res_addr) < 0) { in arch_plt_sym_val()
274 assert(lte->arch.plt_stub_vma != 0); in arch_plt_sym_val()
275 return lte->arch.plt_stub_vma + PPC64_PLT_STUB_SIZE * ndx; in arch_plt_sym_val()
306 arch_translate_address(struct ltelf *lte, in arch_translate_address() argument
309 if (lte->ehdr.e_machine == EM_PPC64) { in arch_translate_address()
313 = (GElf_Addr)(uintptr_t)addr - lte->arch.opd_base; in arch_translate_address()
315 if (elf_read_u64(lte->arch.opd_data, offset, &value) < 0) { in arch_translate_address()
320 *ret = (arch_addr_t)(uintptr_t)(value + lte->bias); in arch_translate_address()
329 load_opd_data(struct ltelf *lte, struct library *lib) in load_opd_data() argument
333 if (elf_get_section_named(lte, ".opd", &sec, &shdr) < 0 in load_opd_data()
340 lte->arch.opd_data = elf_rawdata(sec, NULL); in load_opd_data()
341 if (lte->arch.opd_data == NULL) in load_opd_data()
344 lte->arch.opd_base = shdr.sh_addr + lte->bias; in load_opd_data()
345 lte->arch.opd_size = shdr.sh_size; in load_opd_data()
357 get_glink_vma(struct ltelf *lte, GElf_Addr ppcgot, Elf_Data *plt_data) in get_glink_vma() argument
362 && (elf_get_section_covering(lte, ppcgot, in get_glink_vma()
424 struct ltelf *lte = data; in reloc_copy_if_irelative() local
426 return CBS_STOP_IF(reloc_is_irelative(lte->ehdr.e_machine, rela) in reloc_copy_if_irelative()
427 && VECT_PUSHBACK(<e->plt_relocs, rela) < 0); in reloc_copy_if_irelative()
431 arch_elf_init(struct ltelf *lte, struct library *lib) in arch_elf_init() argument
433 if (lte->ehdr.e_machine == EM_PPC64 in arch_elf_init()
434 && load_opd_data(lte, lib) < 0) in arch_elf_init()
437 lte->arch.secure_plt = !(lte->plt_flags & SHF_EXECINSTR); in arch_elf_init()
443 if (lte->ehdr.e_machine == EM_PPC && !lte->arch.secure_plt) in arch_elf_init()
444 lib->arch.bss_plt_prelinked = nonzero_data(lte->plt_data); in arch_elf_init()
458 if ((lte->ehdr.e_machine == EM_PPC64 || lte->arch.secure_plt) in arch_elf_init()
459 && elf_load_dynamic_entry(lte, DT_RELA, &rela) == 0 in arch_elf_init()
460 && elf_load_dynamic_entry(lte, DT_RELASZ, &relasz) == 0 in arch_elf_init()
461 && elf_get_section_covering(lte, rela, &rela_sec, &rela_shdr) == 0 in arch_elf_init()
466 int ret = elf_read_relocs(lte, rela_sec, &rela_shdr, &v); in arch_elf_init()
469 reloc_copy_if_irelative, lte) != NULL) in arch_elf_init()
478 if (lte->ehdr.e_machine == EM_PPC && lte->arch.secure_plt) { in arch_elf_init()
480 if (elf_load_dynamic_entry(lte, DT_PPC_GOT, &ppcgot) < 0) { in arch_elf_init()
484 GElf_Addr glink_vma = get_glink_vma(lte, ppcgot, lte->plt_data); in arch_elf_init()
486 size_t count = vect_size(<e->plt_relocs); in arch_elf_init()
487 lte->arch.plt_stub_vma = glink_vma in arch_elf_init()
489 debug(1, "stub_vma is %#" PRIx64, lte->arch.plt_stub_vma); in arch_elf_init()
491 } else if (lte->ehdr.e_machine == EM_PPC64) { in arch_elf_init()
493 if (elf_load_dynamic_entry(lte, DT_PPC64_GLINK, in arch_elf_init()
500 lte->arch.plt_stub_vma = glink_vma + 32; in arch_elf_init()
504 if (elf_load_dynamic_entry(lte, DT_PLTGOT, in arch_elf_init()
513 if (lte->ehdr.e_machine == EM_PPC64 in arch_elf_init()
514 && lte->symtab != NULL && lte->strtab != NULL) { in arch_elf_init()
527 for (i = 0; i < lte->symtab_count; ++i) { in arch_elf_init()
529 if (gelf_getsym(lte->symtab, i, &sym) == NULL) { in arch_elf_init()
532 for (sym = lte->arch.stubs; sym != NULL; ) { in arch_elf_init()
538 lte->arch.stubs = NULL; in arch_elf_init()
542 const char *name = lte->strtab + sym.st_name; in arch_elf_init()
579 (uintptr_t)sym.st_value + lte->bias; in arch_elf_init()
584 libsym->next = lte->arch.stubs; in arch_elf_init()
585 lte->arch.stubs = libsym; in arch_elf_init()
627 arch_elf_add_func_entry(struct process *proc, struct ltelf *lte, in arch_elf_add_func_entry() argument
632 if (lte->ehdr.e_machine != EM_PPC || lte->ehdr.e_type == ET_DYN) in arch_elf_add_func_entry()
642 size_t len = vect_size(<e->plt_relocs); in arch_elf_add_func_entry()
645 GElf_Rela *rela = VECT_ELEMENT(<e->plt_relocs, GElf_Rela, i); in arch_elf_add_func_entry()
646 if (sym->st_value == arch_plt_sym_val(lte, i, rela)) { in arch_elf_add_func_entry()
665 if (elf_add_plt_entry(proc, lte, name, rela, in arch_elf_add_func_entry()
691 arch_elf_add_plt_entry(struct process *proc, struct ltelf *lte, in arch_elf_add_plt_entry() argument
695 bool is_irelative = reloc_is_irelative(lte->ehdr.e_machine, rela); in arch_elf_add_plt_entry()
700 GElf_Addr addr = lte->ehdr.e_machine == EM_PPC64 in arch_elf_add_plt_entry()
702 : arch_plt_sym_val(lte, ndx, rela); in arch_elf_add_plt_entry()
703 name = linux_elf_find_irelative_name(lte, addr); in arch_elf_add_plt_entry()
713 if (lte->ehdr.e_machine == EM_PPC) { in arch_elf_add_plt_entry()
714 if (default_elf_add_plt_entry(proc, lte, name, rela, ndx, in arch_elf_add_plt_entry()
718 if (! lte->arch.secure_plt) { in arch_elf_add_plt_entry()
735 for (symp = <e->arch.stubs; *symp != NULL; ) { in arch_elf_add_plt_entry()
758 GElf_Addr plt_entry_addr = arch_plt_sym_val(lte, ndx, rela); in arch_elf_add_plt_entry()
761 assert(plt_slot_addr >= lte->plt_addr in arch_elf_add_plt_entry()
762 || plt_slot_addr < lte->plt_addr + lte->plt_size); in arch_elf_add_plt_entry()
813 arch_elf_destroy(struct ltelf *lte) in arch_elf_destroy() argument
816 for (sym = lte->arch.stubs; sym != NULL; ) { in arch_elf_destroy()