OSDN Git Service

Patch from Bradley D. LaRonde:
authorEric Andersen <andersen@codepoet.org>
Wed, 12 May 2004 23:11:30 +0000 (23:11 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 12 May 2004 23:11:30 +0000 (23:11 -0000)
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.

ldso/ldso/dl-startup.c

index 1bb480e..9b6ef76 100644 (file)
@@ -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++;