Lines Matching refs:dso

61 struct dso {
69 struct dso *next, *prev;
79 struct dso *syms_next, *lazy_next;
93 struct dso **deps, *needed_by;
104 struct dso *fini_next;
121 struct dso *dso;
136 static struct dso ldso;
137 static struct dso *head, *tail, *fini_head, *syms_tail, *lazy_head;
153 static struct dso *builtin_deps[2];
154 static struct dso *const no_deps[1];
155 static struct dso *builtin_ctor_queue[4];
156 static struct dso **main_ctor_queue;
180 /* Compute load address for a virtual address in a given dso. */
182 static void *laddr(const struct dso *p, size_t v)
189 static void *laddr_pg(const struct dso *p, size_t v)
257 static Sym *sysv_lookup(const char *s, uint32_t h, struct dso *dso)
260 Sym *syms = dso->syms;
261 Elf_Symndx *hashtab = dso->hashtab;
262 char *strings = dso->strings;
264 if ((!dso->versym || dso->versym[i] >= 0)
271 static Sym *gnu_lookup(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s)
283 if ((h1 == (h2|1)) && (!dso->versym || dso->versym[i] >= 0)
284 && !strcmp(s, dso->strings + dso->syms[i].st_name))
285 return dso->syms+i;
292 static Sym *gnu_lookup_filtered(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s, uint32_t fofs, size_t fmask)
301 return gnu_lookup(h1, hashtab, dso, s);
314 static inline struct symdef find_sym2(struct dso *dso, const char *s, int need_def, int use_deps)
319 struct dso **deps = use_deps ? dso->deps : 0;
320 for (; dso; dso=use_deps ? *deps++ : dso->syms_next) {
322 if ((ght = dso->ghashtab)) {
323 sym = gnu_lookup_filtered(gh, ght, dso, s, gho, ghm);
326 sym = sysv_lookup(s, h, dso);
339 def.dso = dso;
345 static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
347 return find_sym2(dso, s, need_def, 0);
384 static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stride)
386 unsigned char *base = dso->base;
387 Sym *syms = dso->syms;
388 char *strings = dso->strings;
401 if (dso == &ldso) {
409 if (skip_relative && IS_RELATIVE(rel[1], dso->syms)) continue;
412 reloc_addr = laddr(dso, rel[0]);
419 /* Save original addend in stage 2 where the dso
435 ? (struct symdef){ .dso = dso, .sym = sym }
439 if (dso->lazy && (type==REL_PLT || type==REL_GOT)) {
440 dso->lazy[3*dso->lazy_cnt+0] = rel[0];
441 dso->lazy[3*dso->lazy_cnt+1] = rel[1];
442 dso->lazy[3*dso->lazy_cnt+2] = addend;
443 dso->lazy_cnt++;
447 dso->name, name);
454 def.dso = dso;
457 sym_val = def.sym ? (size_t)laddr(def.dso, def.sym->st_value) : 0;
461 && def.dso->tls_id > static_tls_cnt) {
464 dso->name, name, def.dso->name);
494 *reloc_addr = def.sym ? (size_t)(def.dso->funcdescs
495 + (def.sym - def.dso->syms)) : 0;
500 reloc_addr[1] = def.sym ? (size_t)def.dso->got : 0;
503 *reloc_addr = def.dso->tls_id;
510 *reloc_addr = tls_val + def.dso->tls.offset + TPOFF_K + addend;
514 *reloc_addr = tls_val - def.dso->tls.offset + addend;
517 *reloc_addr = def.dso->tls.offset - tls_val + addend;
522 if (def.dso->tls_id > static_tls_cnt) {
527 dso->name, sym ? name : "(local)" );
530 new->next = dso->td_index;
531 dso->td_index = new;
532 new->args[0] = def.dso->tls_id;
539 reloc_addr[1] = tls_val + def.dso->tls.offset
542 reloc_addr[1] = tls_val - def.dso->tls.offset
556 dso->name, type);
563 static void do_relr_relocs(struct dso *dso, size_t *relr, size_t relr_size)
565 if (dso == &ldso) return; /* self-relocation was done in _dlstart */
566 unsigned char *base = dso->base;
570 reloc_addr = laddr(dso, relr[0]);
583 struct dso *p = lazy_head, *next;
606 static void reclaim(struct dso *dso, size_t start, size_t end)
608 if (start >= dso->relro_start && start < dso->relro_end) start = dso->relro_end;
609 if (end >= dso->relro_start && end < dso->relro_end) end = dso->relro_start;
611 char *base = laddr_pg(dso, start);
615 static void reclaim_gaps(struct dso *dso)
617 Phdr *ph = dso->phdr;
618 size_t phcnt = dso->phnum;
620 for (; phcnt--; ph=(void *)((char *)ph+dso->phentsize)) {
623 reclaim(dso, ph->p_vaddr & -PAGE_SIZE, ph->p_vaddr);
624 reclaim(dso, ph->p_vaddr+ph->p_memsz,
672 static void unmap_library(struct dso *dso)
674 if (dso->loadmap) {
676 for (i=0; i<dso->loadmap->nsegs; i++) {
677 if (!dso->loadmap->segs[i].p_memsz)
679 munmap((void *)dso->loadmap->segs[i].addr,
680 dso->loadmap->segs[i].p_memsz);
682 free(dso->loadmap);
683 } else if (dso->map && dso->map_len) {
684 munmap(dso->map, dso->map_len);
688 static void *map_library(int fd, struct dso *dso)
731 dso->tls.align = ph->p_align;
732 dso->tls.len = ph->p_filesz;
733 dso->tls.size = ph->p_memsz;
735 dso->relro_start = ph->p_vaddr & -PAGE_SIZE;
736 dso->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
759 dso->loadmap = calloc(1, sizeof *dso->loadmap
760 + nsegs * sizeof *dso->loadmap->segs);
761 if (!dso->loadmap) goto error;
762 dso->loadmap->nsegs = nsegs;
772 unmap_library(dso);
775 dso->loadmap->segs[i].addr = (size_t)map +
777 dso->loadmap->segs[i].p_vaddr = ph->p_vaddr;
778 dso->loadmap->segs[i].p_memsz = ph->p_memsz;
794 map = (void *)dso->loadmap->segs[0].addr;
813 dso->map = map;
814 dso->map_len = map_len;
822 dso->phdr = 0;
823 dso->phnum = 0;
828 if (!dso->phdr && eh->e_phoff >= ph->p_offset
830 dso->phdr = (void *)(base + ph->p_vaddr
832 dso->phnum = eh->e_phnum;
833 dso->phentsize = eh->e_phentsize;
877 dso->base = base;
878 dso->dynv = laddr(dso, dyn);
879 if (dso->tls.size) dso->tls.image = laddr(dso, tls_image);
885 if (map!=MAP_FAILED) unmap_library(dso);
916 static int fixup_rpath(struct dso *p, char *buf, size_t buf_size)
993 static void decode_dyn(struct dso *p)
1013 static size_t count_syms(struct dso *p)
1044 static void makefuncdescs(struct dso *p)
1072 static struct dso *load_library(const char *name, struct dso *needed_by)
1080 struct dso *p, temp_dso = {0};
1303 static void load_direct_deps(struct dso *p)
1310 if (p==head) for (struct dso *q=p->next; q; q=q->next)
1323 if (p==head) for (struct dso *q=p->next; q; q=q->next)
1327 struct dso *dep = load_library(p->strings + p->dynv[i+1], p);
1340 static void load_deps(struct dso *p)
1347 static void extend_bfs_deps(struct dso *p)
1350 struct dso **tmp;
1370 struct dso *dep = p->deps[i];
1412 static void add_syms(struct dso *p)
1420 static void revert_syms(struct dso *old_tail)
1422 struct dso *p, *next;
1432 static void do_mips_relocs(struct dso *p, size_t *got)
1452 static void reloc_all(struct dso *p)
1481 static void kernel_mapped_dso(struct dso *p)
1513 struct dso *p;
1552 static struct dso **queue_ctors(struct dso *dso)
1555 struct dso *p, **queue, **stack;
1563 if (dso->bfs_built) {
1564 for (cnt=0; dso->deps[cnt]; cnt++)
1565 dso->deps[cnt]->mark = 0;
1572 if (dso==head && cnt <= countof(builtin_ctor_queue))
1585 * dso and initial queue empty... */
1589 stack[--spos] = dso;
1590 dso->next_dep = 0;
1591 dso->mark = 1;
1621 static void do_init_fini(struct dso **queue)
1623 struct dso *p;
1695 struct dso *dtv_provider = container_of(tls_tail, struct dso, tls);
1697 struct dso *p;
1843 static struct dso app, vdso;
2007 /* Initial dso chain consists only of the app. */
2015 ldso.deps = (struct dso **)no_deps;
2018 for (struct dso *p=head; p; p=p->next)
2041 vdso.deps = (struct dso **)no_deps;
2111 if (find_sym(head, "malloc", 1).dso != &ldso)
2113 if (find_sym(head, "aligned_alloc", 1).dso != &ldso)
2136 static void prepare_lazy(struct dso *p)
2160 struct dso *volatile p, *orig_tail, *orig_syms_tail, *orig_lazy_head, *next;
2166 struct dso **volatile ctor_queue = 0;
2297 struct dso *p;
2305 struct dso *p;
2336 static void *do_dlsym(struct dso *p, const char *s, void *ra)
2355 return __tls_get_addr((tls_mod_off_t []){def.dso->tls_id, def.sym->st_value-DTP_OFFSET});
2357 return def.dso->funcdescs + (def.sym - def.dso->syms);
2358 return laddr(def.dso, def.sym->st_value);
2364 struct dso *p;
2466 struct dso *current;