Home | History | Annotate | Download | only in linker

Lines Matching refs:si

75 static bool soinfo_link_image(soinfo* si);
309 soinfo* si = gSoInfoFreeList;
313 memset(si, 0, sizeof(soinfo));
314 strlcpy(si->name, name, sizeof(si->name));
315 sonext->next = si;
316 sonext = si;
318 TRACE("name %s: allocated soinfo @ %p", name, si);
319 return si;
322 static void soinfo_free(soinfo* si)
324 if (si == NULL) {
330 TRACE("name %s: freeing soinfo @ %p", si->name, si);
333 if (trav == si)
338 /* si was not in solist */
339 DL_ERR("name \"%s\" is not in solist!", si->name);
346 prev->next = si->next;
347 if (si == sonext) {
350 si->next = gSoInfoFreeList;
351 gSoInfoFreeList = si;
404 soinfo *si;
407 for (si = solist; si != 0; si = si->next){
408 if ((addr >= si->base) && (addr < (si->base + si->size))) {
409 *pcount = si->ARM_exidx_count;
410 return (_Unwind_Ptr)si->ARM_exidx;
426 for (soinfo* si = solist; si != NULL; si = si->next) {
428 dl_info.dlpi_addr = si->link_map.l_addr;
429 dl_info.dlpi_name = si->link_map.l_name;
430 dl_info.dlpi_phdr = si->phdr;
431 dl_info.dlpi_phnum = si->phnum;
442 static Elf32_Sym* soinfo_elf_lookup(soinfo* si, unsigned hash, const char* name) {
444 Elf32_Sym* symtab = si->symtab;
445 const char* strtab = si->strtab;
449 name, si->name, si->base, hash, hash % si->nbucket);
450 n = hash % si->nbucket;
452 for (n = si->bucket[hash % si->nbucket]; n != 0; n = si->chain[n]) {
465 name, si->name, s->st_value, s->st_size);
486 static Elf32_Sym* soinfo_do_lookup(soinfo* si, const char* name, soinfo** lsi, soinfo* needed[]) {
490 if (si != NULL && somain != NULL) {
497 if (si == somain) {
498 s = soinfo_elf_lookup(si, elf_hash, name);
500 *lsi = si;
512 if (!si->has_DT_SYMBOLIC) {
514 si->name, name, somain->name);
532 s = soinfo_elf_lookup(si, elf_hash, name);
534 *lsi = si;
543 if (si->has_DT_SYMBOLIC) {
545 si->name, name, somain->name);
566 si->name, name, needed[i]->name);
576 TRACE_TYPE(LOOKUP, "si %s sym %s s->st_value = 0x%08x, "
578 si->name, name, s->st_value,
595 Elf32_Sym* dlsym_handle_lookup(soinfo* si, const char* name)
597 return soinfo_elf_lookup(si, elfhash(name), name);
613 for (soinfo* si = start; (s == NULL) && (si != NULL); si = si->next) {
614 s = soinfo_elf_lookup(si, elf_hash, name);
616 *found = si;
631 for (soinfo* si = solist; si != NULL; si = si->next) {
632 if (address >= si->base && address - si->base < si->size) {
633 return si;
639 Elf32_Sym* dladdr_find_symbol(soinfo* si, const void* addr) {
640 Elf32_Addr soaddr = reinterpret_cast<Elf32_Addr>(addr) - si->base;
644 for (size_t i = 0; i < si->nchain; ++i) {
645 Elf32_Sym* sym = &si->symtab[i];
657 static void dump(soinfo* si)
659 Elf32_Sym* s = si->symtab;
660 for (unsigned n = 0; n < si->nchain; n++) {
663 si->strtab + s->st_name);
720 soinfo* si = soinfo_alloc(bname ? bname + 1 : name);
721 if (si == NULL) {
724 si->base = elf_reader.load_start();
725 si->size = elf_reader.load_size();
726 si->load_bias = elf_reader.load_bias();
727 si->flags = 0;
728 si->entry = 0;
729 si->dynamic = NULL;
730 si->phnum = elf_reader.phdr_count();
731 si->phdr = elf_reader.loaded_phdr();
732 return si;
737 soinfo *si;
746 for (si = solist; si != NULL; si = si->next) {
747 if (!strcmp(bname, si->name)) {
748 return si;
759 soinfo* si = find_loaded_library(name);
760 if (si != NULL) {
761 if (si->flags & FLAG_LINKED) {
762 return si;
764 DL_ERR("OOPS: recursive link to \"%s\"", si->name);
769 si = load_library(name);
770 if (si == NULL) {
777 si->base, si->size, si->name);
779 if (!soinfo_link_image(si)) {
780 munmap(reinterpret_cast<void*>(si->base), si->size);
781 soinfo_free(si);
785 return si;
789 soinfo* si = find_library_internal(name);
790 if (si != NULL) {
791 si->ref_count++;
793 return si;
796 static int soinfo_unload(soinfo* si) {
797 if (si->ref_count == 1) {
798 TRACE("unloading '%s'", si->name);
799 si->CallDestructors();
801 for (Elf32_Dyn* d = si->dynamic; d->d_tag != DT_NULL; ++d) {
803 const char* library_name = si->strtab + d->d_un.d_val;
804 TRACE("%s needs to unload %s", si->name, library_name);
809 munmap(reinterpret_cast<void*>(si->base), si->size);
810 notify_gdb_of_unload(si);
811 soinfo_free(si);
812 si->ref_count = 0;
814 si->ref_count--;
815 TRACE("not unloading '%s', decrementing ref_count to %d", si->name, si->ref_count);
832 soinfo* si = find_library(name);
833 if (si != NULL) {
834 si->CallConstructors();
837 return si;
840 int do_dlclose(soinfo* si) {
842 int result = soinfo_unload(si);
851 static int soinfo_relocate(soinfo* si, Elf32_Rel* rel, unsigned count,
854 Elf32_Sym* symtab = si->symtab;
855 const char* strtab = si->strtab;
863 Elf32_Addr reloc = static_cast<Elf32_Addr>(rel->r_offset + si->load_bias);
867 DEBUG("Processing '%s' relocation at index %d", si->name, idx);
873 s = soinfo_do_lookup(si, sym_name, &lsi, needed);
879 DL_ERR("cannot locate symbol \"%s\" referenced by \"%s\"...", sym_name, si->name);
932 if ((base == 0) && (si->base != 0)) {
998 *reinterpret_cast<Elf32_Addr*>(reloc) += si->base;
1014 TRACE_TYPE(RELO, "RELO RELATIVE %08x <- +%08x", reloc, si->base);
1015 *reinterpret_cast<Elf32_Addr*>(reloc) += si->base;
1038 if ((si->flags & FLAG_EXE) == 0) {
1050 DL_ERR("%s R_ARM_COPY relocations only supported for ET_EXEC", si->name);
1060 si->name);
1065 "library %s (built with -Bsymbolic?)", si->name, lsi->name);
1070 si->name, s->st_size, src->st_size);
1075 DL_ERR("%s R_ARM_COPY relocation target cannot be resolved", si->name);
1091 static int mips_relocate_got(soinfo* si, soinfo* needed[]) {
1097 got = si->plt_got;
1098 local_gotno = si->mips_local_gotno;
1099 gotsym = si->mips_gotsym;
1100 symtabno = si->mips_symtabno;
1101 symtab = si->symtab;
1111 if ((si->flags & FLAG_LINKER) == 0) {
1121 got[g] += si->load_bias;
1127 got = si->plt_got + local_gotno;
1134 sym_name = si->strtab + sym->st_name;
1135 s = soinfo_do_lookup(si, sym_name, &lsi, needed);
1308 static bool soinfo_link_image(soinfo* si) {
1310 Elf32_Addr base = si->load_bias;
1311 const Elf32_Phdr *phdr = si->phdr;
1312 int phnum = si->phnum;
1313 bool relocating_linker = (si->flags & FLAG_LINKER) != 0;
1317 INFO("[ linking %s ]", si->name);
1318 DEBUG("si->base = 0x%08x si->flags = 0x%08x", si->base, si->flags);
1324 phdr_table_get_dynamic_section(phdr, phnum, base, &si->dynamic,
1326 if (si->dynamic == NULL) {
1328 DL_ERR("missing PT_DYNAMIC in \"%s\"", si->name);
1333 DEBUG("dynamic = %p", si->dynamic);
1339 &si->ARM_exidx, &si->ARM_exidx_count);
1344 for (Elf32_Dyn* d = si->dynamic; d->d_tag != DT_NULL; ++d) {
1348 si->nbucket = ((unsigned *) (base + d->d_un.d_ptr))[0];
1349 si->nchain = ((unsigned *) (base + d->d_un.d_ptr))[1];
1350 si->bucket = (unsigned *) (base + d->d_un.d_ptr + 8);
1351 si->chain = (unsigned *) (base + d->d_un.d_ptr + 8 + si->nbucket * 4);
1354 si->strtab = (const char *) (base + d->d_un.d_ptr);
1357 si->symtab = (Elf32_Sym *) (base + d->d_un.d_ptr);
1361 DL_ERR("unsupported DT_RELA in \"%s\"", si->name);
1366 si->plt_rel = (Elf32_Rel*) (base + d->d_un.d_ptr);
1369 si->plt_rel_count = d->d_un.d_val / sizeof(Elf32_Rel);
1372 si->rel = (Elf32_Rel*) (base + d->d_un.d_ptr);
1375 si->rel_count = d->d_un.d_val / sizeof(Elf32_Rel);
1379 si->plt_got = (unsigned *)(base + d->d_un.d_ptr);
1389 DL_ERR("unsupported DT_RELA in \"%s\"", si->name);
1392 si->init_func = reinterpret_cast<linker_function_t>(base + d->d_un.d_ptr);
1393 DEBUG("%s constructors (DT_INIT) found at %p", si->name, si->init_func);
1396 si->fini_func = reinterpret_cast<linker_function_t>(base + d->d_un.d_ptr);
1397 DEBUG("%s destructors (DT_FINI) found at %p", si->name, si->fini_func);
1400 si->init_array = reinterpret_cast<linker_function_t*>(base + d->d_un.d_ptr);
1401 DEBUG("%s constructors (DT_INIT_ARRAY) found at %p", si->name, si->init_array);
1404 si->init_array_count = ((unsigned)d->d_un.d_val) / sizeof(Elf32_Addr);
1407 si->fini_array = reinterpret_cast<linker_function_t*>(base + d->d_un.d_ptr);
1408 DEBUG("%s destructors (DT_FINI_ARRAY) found at %p", si->name, si->fini_array);
1411 si->fini_array_count = ((unsigned)d->d_un.d_val) / sizeof(Elf32_Addr);
1414 si->preinit_array = reinterpret_cast<linker_function_t*>(base + d->d_un.d_ptr);
1415 DEBUG("%s constructors (DT_PREINIT_ARRAY) found at %p", si->name, si->preinit_array);
1418 si->preinit_array_count = ((unsigned)d->d_un.d_val) / sizeof(Elf32_Addr);
1421 si->has_text_relocations = true;
1424 si->has_DT_SYMBOLIC = true;
1433 si->has_text_relocations = true;
1436 si->has_DT_SYMBOLIC = true;
1459 si->mips_symtabno = d->d_un.d_val;
1463 si->mips_local_gotno = d->d_un.d_val;
1467 si->mips_gotsym = d->d_un.d_val;
1477 DEBUG("si->base = 0x%08x, si->strtab = %p, si->symtab = %p",
1478 si->base, si->strtab, si->symtab);
1485 if (si->nbucket == 0) {
1486 DL_ERR("empty/missing DT_HASH in \"%s\" (built with --hash-style=gnu?)", si->name);
1489 if (si->strtab == 0) {
1490 DL_ERR("empty/missing DT_STRTAB in \"%s\"", si->name);
1493 if (si->symtab == 0) {
1494 DL_ERR("empty/missing DT_SYMTAB in \"%s\"", si->name);
1499 if (si->flags & FLAG_EXE) {
1506 gLdPreloadNames[i], si->name, tmp_err_buf);
1516 for (Elf32_Dyn* d = si->dynamic; d->d_tag != DT_NULL; ++d) {
1518 const char* library_name = si->strtab + d->d_un.d_val;
1519 DEBUG("%s needs %s", si->name, library_name);
1524 library_name, si->name, tmp_err_buf);
1532 if (si->has_text_relocations) {
1538 if (phdr_table_unprotect_segments(si->phdr, si->phnum, si->load_bias) < 0) {
1540 si->name, strerror(errno));
1545 if (si->plt_rel != NULL) {
1546 DEBUG("[ relocating %s plt ]", si->name );
1547 if (soinfo_relocate(si, si->plt_rel, si->plt_rel_count, needed)) {
1551 if (si->rel != NULL) {
1552 DEBUG("[ relocating %s ]", si->name );
1553 if (soinfo_relocate(si, si->rel, si->rel_count, needed)) {
1559 if (mips_relocate_got(si, needed)) {
1564 si->flags |= FLAG_LINKED;
1565 DEBUG("[ finished linking %s ]", si->name);
1567 if (si->has_text_relocations) {
1570 if (phdr_table_protect_segments(si->phdr, si->phnum, si->load_bias) < 0) {
1572 si->name, strerror(errno));
1578 if (phdr_table_protect_gnu_relro(si->phdr, si->phnum, si->load_bias) < 0) {
1580 si->name, strerror(errno));
1589 notify_gdb_of_load(si);
1636 soinfo* si = soinfo_alloc(args.argv[0]);
1637 if (si == NULL) {
1642 si->flags |= FLAG_EXE;
1643 link_map_t* map = &(si->link_map);
1680 si->phdr = reinterpret_cast<Elf32_Phdr*>(args.getauxval(AT_PHDR));
1681 si->phnum = args.getauxval(AT_PHNUM);
1682 si->entry = args.getauxval(AT_ENTRY);
1684 /* Compute the value of si->base. We can't rely on the fact that
1688 si->base = 0;
1689 si->size = phdr_table_get_load_size(si->phdr, si->phnum);
1690 si->load_bias = 0;
1691 for (size_t i = 0; i < si->phnum; ++i) {
1692 if (si->phdr[i].p_type == PT_PHDR) {
1693 si->load_bias = reinterpret_cast<Elf32_Addr>(si->phdr) - si->phdr[i].p_vaddr;
1694 si->base = reinterpret_cast<Elf32_Addr>(si->phdr) - si->phdr[i].p_offset;
1698 si->dynamic = NULL;
1699 si->ref_count = 1;
1705 somain = si;
1707 if (!soinfo_link_image(si)) {
1712 si->CallPreInitConstructors();
1718 /* After the link_image, the si->load_bias is initialized.
1723 map->l_addr = si->load_bias;
1724 si->CallConstructors();
1764 TRACE("[ Ready to execute '%s' @ 0x%08x ]", si->name, si->entry);
1765 return si->entry;