Browse Source

Patch from Bradley D. LaRonde:
ld.so mprotect rwx .dyanmic segment for mips DT_DEBUG
Allow writing debug_addr into the .dynamic segment.
Even though the program header is marked RWE, the kernel
gives it to us rx.

Eric Andersen 21 năm trước cách đây
mục cha
commit
8525fd1b97
1 tập tin đã thay đổi với 9 bổ sung4 xóa
  1. 9 4
      ldso/ldso/dl-startup.c

+ 9 - 4
ldso/ldso/dl-startup.c

@@ -377,13 +377,18 @@ found_got:
 					}
 					app_tpnt->dynamic_info[dpnt->d_tag] = dpnt->d_un.d_val;
 
-#warning "Debugging threads on mips won't work till someone fixes this..."
-#if 0
 					if (dpnt->d_tag == DT_DEBUG) {
+						/* Allow writing debug_addr into the .dynamic segment.
+						 * Even though the program header is marked RWE, the kernel gives
+						 * it to us rx.
+						 */
+						Elf32_Addr mpa = (ppnt->p_vaddr + app_tpnt->loadaddr) & ~(_dl_pagesize - 1);
+						if(_dl_mprotect(mpa, ppnt->p_memsz, PROT_READ | PROT_WRITE | PROT_EXEC)) {
+							SEND_STDERR("Couldn't mprotect .dynamic segment to rwx.\n");
+							_dl_exit(0);
+						}
 						dpnt->d_un.d_val = (unsigned long) debug_addr;
 					}
-#endif
-
 #else
 					if (dpnt->d_tag > DT_JMPREL) {
 						dpnt++;