:> 
:> Can somebody who is feeling adventurous and has an alpha box please
:> test whether this fixes it for now?
:
:Nope, if anything it's now worse. :(  We should perhaps revert this
:change in -stable until we can get it to work in -current.  FWIW, with
:the patch all sorts of programs no longer work including find,
:rpc.lockd, cron, sendmail, getty, etc., not just static c++ programs.
:
:-- 
:
:John Baldwin <[EMAIL PROTECTED]>  <><  http://www.FreeBSD.org/~jhb/
:"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

    Lets try just reverting the algorithm, and keeping the RLIMIT
    stuff intact.  Here's the patch for -current.  Please review.

                                                -Matt

Index: imgact_elf.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/imgact_elf.c,v
retrieving revision 1.124
diff -u -r1.124 imgact_elf.c
--- imgact_elf.c        2 Sep 2002 17:27:30 -0000       1.124
+++ imgact_elf.c        3 Sep 2002 21:11:01 -0000
@@ -734,20 +734,23 @@
                            phdr[i].p_vaddr - seg_addr);
 
                        /*
-                        * Is this .text or .data?  Use VM_PROT_WRITE
-                        * to distinguish between the two for the purpose
-                        * of limit checking and vmspace fields.
+                        * Is this .text or .data?  We can't use
+                        * VM_PROT_WRITE or VM_PROT_EXEC, it breaks the
+                        * alpha terribly and possibly does other bad
+                        * things so we stick with the address check.
                         */
-                       if (prot & VM_PROT_WRITE) {
-                               data_size += seg_size;
-                               if (data_addr == 0)
-                                       data_addr = seg_addr;
+
+                       /* Does the entry point belong to this segment? */
+                       if (hdr->e_entry >= phdr[i].p_vaddr &&
+                           hdr->e_entry < (phdr[i].p_vaddr +
+                           phdr[i].p_memsz)) {
+                               entry = (u_long)hdr->e_entry;
+                               text_size = seg_size;
+                               text_addr = seg_addr;
                        } else {
-                               text_size += seg_size;
-                               if (text_addr == 0)
-                                       text_addr = seg_addr;
+                               data_size = seg_size;
+                               data_addr = seg_addr;
                        }
-
                        /*
                         * Check limits.  It should be safe to check the
                         * limits after loading the segment since we do
@@ -762,12 +765,6 @@
                                goto fail;
                        }
 
-                       /* Does the entry point belong to this segment? */
-                       if (hdr->e_entry >= phdr[i].p_vaddr &&
-                           hdr->e_entry < (phdr[i].p_vaddr +
-                           phdr[i].p_memsz)) {
-                               entry = (u_long)hdr->e_entry;
-                       }
                        break;
                case PT_PHDR:   /* Program header table info */
                        proghdr = phdr[i].p_vaddr;

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to