- if (auxv[i]==AT_SYSINFO_EHDR) {
- vdso_base = auxv[i+1];
- break;
- }
- }
-
- /* Find the dynamic linker's DYNAMIC section and decode it */
- ehdr = (void *)aux[AT_BASE];
- phdr = (void *)(aux[AT_BASE] + ehdr->e_phoff);
- for (i=ehdr->e_phnum; i--; phdr=(void *)((char *)phdr + ehdr->e_phentsize)) {
- if (phdr->p_type == PT_DYNAMIC) {
- lib_dynv = (void *)(aux[AT_BASE] + phdr->p_vaddr);
- decode_vec(lib_dynv, lib_dyn, DYN_CNT);
- break;
- }
- }
-
- /* Find the program image's DYNAMIC section and decode it */
- phdr = (void *)aux[AT_PHDR];
- for (i=aux[AT_PHNUM]; i--; phdr=(void *)((char *)phdr + aux[AT_PHENT])) {
- if (phdr->p_type == PT_DYNAMIC) {
- decode_vec((void *)phdr->p_vaddr, app_dyn, DYN_CNT);
- break;
- }
- }
-
- *app = (struct dso){
- .base = 0,
- .strings = (void *)(app_dyn[DT_STRTAB]),
- .hashtab = (void *)(app_dyn[DT_HASH]),
- .syms = (void *)(app_dyn[DT_SYMTAB]),
- .dynv = (void *)(phdr->p_vaddr),
- .name = argv[0],
- .global = 1,
- .next = lib
- };
-
- *lib = (struct dso){
- .base = (void *)aux[AT_BASE],
- .strings = (void *)(aux[AT_BASE]+lib_dyn[DT_STRTAB]),
- .hashtab = (void *)(aux[AT_BASE]+lib_dyn[DT_HASH]),
- .syms = (void *)(aux[AT_BASE]+lib_dyn[DT_SYMTAB]),
- .dynv = lib_dynv,
- .name = "libc.so",
- .global = 1,
- .relocated = 1
- };
-
- if (vdso_base) {