Explorar o código

Hopefully fix Laszlo and Jacobs dlopen problem.

Joakim Tjernlund %!s(int64=21) %!d(string=hai) anos
pai
achega
8e4a1b8a99
Modificáronse 2 ficheiros con 5 adicións e 2 borrados
  1. 1 1
      ldso/ldso/ldso.c
  2. 4 1
      ldso/libdl/libdl.c

+ 1 - 1
ldso/ldso/ldso.c

@@ -139,7 +139,7 @@ void _dl_get_ready_to_run(struct elf_resolve *tpnt, unsigned long load_addr,
 		tpnt->ppnt = myppnt = (ElfW(Phdr) *) (load_addr + epnt->e_phoff);
 		for (j = 0; j < epnt->e_phnum; j++, myppnt++) {
 			if (myppnt->p_type == PT_DYNAMIC) {
-				tpnt->dynamic_addr = (ElfW(Dyn) *)myppnt->p_vaddr + load_addr;
+				tpnt->dynamic_addr = (ElfW(Dyn) *)(myppnt->p_vaddr + load_addr);
 				tpnt->dynamic_size = myppnt->p_filesz;
 			}
 		}

+ 4 - 1
ldso/libdl/libdl.c

@@ -179,8 +179,11 @@ void *dlopen(const char *libname, int flag)
 	if(_dl_debug)
 		fprintf(stderr, "Trying to dlopen '%s'\n", (char*)libname);
 #endif
-	if (!(tpnt = _dl_check_if_named_library_is_loaded((char *)libname, 0)))
+	tpnt = _dl_check_if_named_library_is_loaded((char *)libname, 0);
+	if (!(tpnt))
 		tpnt = _dl_load_shared_library(0, &rpnt, tfrom, (char*)libname, 0);
+	else
+		tpnt->usage_count++;
 	if (tpnt == NULL) {
 		_dl_unmap_cache();
 		return NULL;