pkgsrc-Changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

CVS commit: pkgsrc/editors/mule



Module Name:    pkgsrc
Committed By:   tsutsui
Date:           Sat Apr 29 01:11:55 UTC 2017

Modified Files:
        pkgsrc/editors/mule: Makefile distinfo
        pkgsrc/editors/mule/patches: patch-aa patch-ab patch-src_alloc_c

Log Message:
Make this ancient mule2 build and work (at least start up) on NetBSD/i386 7.1.

- pull unexelf.c from newer emacs to fix coredump on dump-charset
- in s/netbsd.h use terminfo rather than obsolete termcap that causes SIGSEGV
- also link temacs with "-Wl,-znocombreloc" for X toolkit as emacs22 did
  XXX: this should be into configure
- specify -fno-builtin-malloc to avoid unexpected gcc's optimization
  and remove hacks in alloc.c
- also specify -fno-strict-aliasing for sanity against 90's files


To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 pkgsrc/editors/mule/Makefile
cvs rdiff -u -r1.14 -r1.15 pkgsrc/editors/mule/distinfo
cvs rdiff -u -r1.2 -r1.3 pkgsrc/editors/mule/patches/patch-aa \
    pkgsrc/editors/mule/patches/patch-src_alloc_c
cvs rdiff -u -r1.3 -r1.4 pkgsrc/editors/mule/patches/patch-ab

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: pkgsrc/editors/mule/Makefile
diff -u pkgsrc/editors/mule/Makefile:1.51 pkgsrc/editors/mule/Makefile:1.52
--- pkgsrc/editors/mule/Makefile:1.51   Sat Jul  4 16:18:29 2015
+++ pkgsrc/editors/mule/Makefile        Sat Apr 29 01:11:55 2017
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.51 2015/07/04 16:18:29 joerg Exp $
+# $NetBSD: Makefile,v 1.52 2017/04/29 01:11:55 tsutsui Exp $
 
 DISTNAME=      mule-2.3
 PKGREVISION=   8
@@ -25,7 +25,7 @@ GNU_CONFIGURE_MANDIR= ${PREFIX}/${PKGMAN
 
 .include "../../mk/bsd.prefs.mk"
 
-CFLAGS+=       -g
+CFLAGS+=       -g -fno-builtin-malloc -fno-strict-aliasing
 
 CONFIGURE_ARGS+=       ${MACHINE_ARCH}--${LOWER_OPSYS} --with-x --with-x-toolkit=lucid
 CONFIGURE_ARGS+=       --terminal-face --mcpath --canna-libraries=${PREFIX}/lib

Index: pkgsrc/editors/mule/distinfo
diff -u pkgsrc/editors/mule/distinfo:1.14 pkgsrc/editors/mule/distinfo:1.15
--- pkgsrc/editors/mule/distinfo:1.14   Tue Nov  3 03:32:18 2015
+++ pkgsrc/editors/mule/distinfo        Sat Apr 29 01:11:55 2017
@@ -1,11 +1,11 @@
-$NetBSD: distinfo,v 1.14 2015/11/03 03:32:18 agc Exp $
+$NetBSD: distinfo,v 1.15 2017/04/29 01:11:55 tsutsui Exp $
 
 SHA1 (mule-2.3.tar.gz) = 52737767955caf2fde34b994f367a89c5d8a045f
 RMD160 (mule-2.3.tar.gz) = 52b93e746a7a796549a44104ab1898954df044bf
 SHA512 (mule-2.3.tar.gz) = 5f6a9047e6c9d752787d6cab3573516c6efd65cd901fbab74d314a5967e6c68b2dc7c2aa7454d8588d421553530c87dd3ee9692d523d818e01739580cb1201fd
 Size (mule-2.3.tar.gz) = 10240256 bytes
-SHA1 (patch-aa) = 927ec514204ef97101fb3f4ab77eec1c71af23f1
-SHA1 (patch-ab) = 7c2cf683e87320190af0306cf7d04b3638600944
+SHA1 (patch-aa) = 1bae7875584cdc6a26d02481713d6fe774374ad8
+SHA1 (patch-ab) = edad8003d994d4418b0effe93d0cce4e807d96fe
 SHA1 (patch-ac) = 170fa4f6c17c805dd32a90e8bfb3e38c48a9fc20
 SHA1 (patch-ad) = 7a52802cd614441320221f450cf97d4e30f40f2b
 SHA1 (patch-ae) = 1f020aaeb75cd7dd2b827ab34382e472add09719
@@ -75,7 +75,7 @@ SHA1 (patch-lib-src_profile_c) = b4e74a5
 SHA1 (patch-lib-src_sorted-doc_c) = 9965f6a6722c2735dfc609a7a15c669f3df8fae4
 SHA1 (patch-lib-src_yow_c) = 38fb3e70395525ce8bb4816acd1b9e64c20f3735
 SHA1 (patch-src_abbrev_c) = c8dc21ca974625b8fe20e96bea37c61f709fbc1a
-SHA1 (patch-src_alloc_c) = a5db486e10072ec3738df001aa555e35ae5a5a07
+SHA1 (patch-src_alloc_c) = aaa4315c2487e3b32deb13940609fbcf4b895bce
 SHA1 (patch-src_buffer_h) = 3d2d0dba98a37265cc4df54bd14b6b51941d9c42
 SHA1 (patch-src_bytecode_c) = 93508ddb17e3ba2c7bb921caf85ce1e4e15791f3
 SHA1 (patch-src_callint_c) = 0b44807e049c12d2625c950efb14fd5409aba058

Index: pkgsrc/editors/mule/patches/patch-aa
diff -u pkgsrc/editors/mule/patches/patch-aa:1.2 pkgsrc/editors/mule/patches/patch-aa:1.3
--- pkgsrc/editors/mule/patches/patch-aa:1.2    Thu Dec  1 18:13:24 2005
+++ pkgsrc/editors/mule/patches/patch-aa        Sat Apr 29 01:11:55 2017
@@ -1,6 +1,6 @@
-$NetBSD: patch-aa,v 1.2 2005/12/01 18:13:24 wiz Exp $
+$NetBSD: patch-aa,v 1.3 2017/04/29 01:11:55 tsutsui Exp $
 
---- src/s/netbsd.h.orig        1995-10-12 11:53:15.000000000 +0100
+--- src/s/netbsd.h.orig        1995-10-12 10:53:15.000000000 +0000
 +++ src/s/netbsd.h
 @@ -3,6 +3,10 @@
  /* Get most of the stuff from bsd4.3 */
@@ -13,18 +13,21 @@ $NetBSD: patch-aa,v 1.2 2005/12/01 18:13
  /* For mem-limits.h.  */
  #define BSD4_2
  
-@@ -30,8 +34,8 @@
+@@ -30,9 +34,10 @@
  #define NO_TERMIO
  
  #define LIBS_DEBUG
 -/* -lutil is not needed for NetBSD >0.9.  */
 -#define LIBS_SYSTEM -lutil -lcrypt
+-#define LIBS_TERMCAP -ltermcap
 +#define LIBS_SYSTEM -lcrypt
 +
- #define LIBS_TERMCAP -ltermcap
++#define TERMINFO
++#define LIBS_TERMCAP -lterminfo
  
  #define NEED_ERRNO
-@@ -40,7 +44,9 @@
+ #define SYSV_SYSTEM_DIR
+@@ -40,7 +45,9 @@
  /* Netbsd has POSIX-style pgrp behavior.  */
  #undef BSD_PGRPS
  
@@ -35,7 +38,7 @@ $NetBSD: patch-aa,v 1.2 2005/12/01 18:13
  /* These definitions should work for either dynamic or static linking,
     whichever is the default for `cc -nostdlib'.  */
  #define HAVE_TEXT_START               /* No need to define `start_of_text'.  */
-@@ -54,14 +60,34 @@
+@@ -54,14 +61,34 @@
  #define N_BSSADDR(x) (N_ALIGN(x, N_DATADDR(x)+x.a_data))
  #define N_TRELOFF(x) N_RELOFF(x)
  #endif
@@ -60,7 +63,7 @@ $NetBSD: patch-aa,v 1.2 2005/12/01 18:13
 +/* Here is how to find X Windows.  LD_SWITCH_X_SITE_AUX gives an -R option
 +   says where to find X windows at run time.  We convert it to a -rpath option
 +   which is what OSF1 uses.  */
-+#define LD_SWITCH_SYSTEM `echo LD_SWITCH_X_SITE_AUX | sed -e 's/-R/-Wl,-rpath,/'`
++#define LD_SWITCH_SYSTEM `echo LD_SWITCH_X_SITE_AUX | sed -e 's/-R/-Wl,-rpath,/'` -Wl,-znocombreloc
 +
 +#define HAVE_TEXT_START               /* No need to define `start_of_text'.  */
 +#define UNEXEC unexelf.o
Index: pkgsrc/editors/mule/patches/patch-src_alloc_c
diff -u pkgsrc/editors/mule/patches/patch-src_alloc_c:1.2 pkgsrc/editors/mule/patches/patch-src_alloc_c:1.3
--- pkgsrc/editors/mule/patches/patch-src_alloc_c:1.2   Sat Dec 24 17:07:07 2011
+++ pkgsrc/editors/mule/patches/patch-src_alloc_c       Sat Apr 29 01:11:55 2017
@@ -1,9 +1,6 @@
-$NetBSD: patch-src_alloc_c,v 1.2 2011/12/24 17:07:07 dholland Exp $
+$NetBSD: patch-src_alloc_c,v 1.3 2017/04/29 01:11:55 tsutsui Exp $
 
 - use standard includes
-- add an empty asm() destroying memory that prevents gcc from
-  optimizing out __malloc_hook and friends (which leads to
-  SIGSEGV in temacs during build)
 
 --- src/alloc.c.orig   1994-10-24 11:37:41.000000000 +0000
 +++ src/alloc.c
@@ -15,33 +12,3 @@ $NetBSD: patch-src_alloc_c,v 1.2 2011/12
  
  #include <config.h>
  #include "lisp.h"
-@@ -240,6 +241,9 @@ emacs_blocked_free (ptr)
- {
-   BLOCK_INPUT;
-   __free_hook = old_free_hook;
-+#ifdef __GNUC__
-+  __asm __volatile("":::"memory");
-+#endif
-   free (ptr);
-   __free_hook = emacs_blocked_free;
-   UNBLOCK_INPUT;
-@@ -253,6 +257,9 @@ emacs_blocked_malloc (size)
- 
-   BLOCK_INPUT;
-   __malloc_hook = old_malloc_hook;
-+#ifdef __GNUC__
-+  __asm __volatile("":::"memory");
-+#endif
-   value = (void *) malloc (size);
-   __malloc_hook = emacs_blocked_malloc;
-   UNBLOCK_INPUT;
-@@ -269,6 +276,9 @@ emacs_blocked_realloc (ptr, size)
- 
-   BLOCK_INPUT;
-   __realloc_hook = old_realloc_hook;
-+#ifdef __GNUC__
-+  __asm __volatile("":::"memory");
-+#endif
-   value = (void *) realloc (ptr, size);
-   __realloc_hook = emacs_blocked_realloc;
-   UNBLOCK_INPUT;

Index: pkgsrc/editors/mule/patches/patch-ab
diff -u pkgsrc/editors/mule/patches/patch-ab:1.3 pkgsrc/editors/mule/patches/patch-ab:1.4
--- pkgsrc/editors/mule/patches/patch-ab:1.3    Sat Dec 24 17:07:07 2011
+++ pkgsrc/editors/mule/patches/patch-ab        Sat Apr 29 01:11:55 2017
@@ -1,9 +1,12 @@
-$NetBSD: patch-ab,v 1.3 2011/12/24 17:07:07 dholland Exp $
+$NetBSD: patch-ab,v 1.4 2017/04/29 01:11:55 tsutsui Exp $
 
---- src/unexelf.c.orig 1994-10-21 05:21:00.000000000 +0100
+Pull unexelf.c from newer emacs.
+
+--- src/unexelf.c.orig 1994-10-21 04:21:00.000000000 +0000
 +++ src/unexelf.c
 @@ -1,19 +1,22 @@
- /* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992
+-/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992
++/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000, 01, 02
     Free Software Foundation, Inc.
  
 -    This program is free software; you can redistribute it and/or modify
@@ -57,245 +60,36 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
   *
   * The boundaries within the a.out file may be adjusted with the data_start
   * and bss_start arguments.  Either or both may be given as 0 for defaults.
-@@ -98,64 +101,64 @@ temacs:
-         Link    Info    Adralgn      Entsize
- 
- [1]     1       2       0x80480d4    0xd4         0x13          .interp
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [2]     5       2       0x80480e8    0xe8         0x388         .hash
--        3       0       0x4          0x4          
-+        3       0       0x4          0x4
- 
- [3]     11      2       0x8048470    0x470        0x7f0         .dynsym
--        4       1       0x4          0x10         
-+        4       1       0x4          0x10
- 
- [4]     3       2       0x8048c60    0xc60        0x3ad         .dynstr
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [5]     9       2       0x8049010    0x1010       0x338         .rel.plt
--        3       7       0x4          0x8          
-+        3       7       0x4          0x8
- 
- [6]     1       6       0x8049348    0x1348       0x3           .init
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [7]     1       6       0x804934c    0x134c       0x680         .plt
--        0       0       0x4          0x4          
-+        0       0       0x4          0x4
- 
- [8]     1       6       0x80499cc    0x19cc       0x3c56f       .text
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [9]     1       6       0x8085f3c    0x3df3c      0x3           .fini
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [10]    1       2       0x8085f40    0x3df40      0x69c         .rodata
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [11]    1       2       0x80865dc    0x3e5dc      0xd51         .rodata1
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [12]    1       3       0x8088330    0x3f330      0x20afc       .data
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [13]    1       3       0x80a8e2c    0x5fe2c      0x89d         .data1
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [14]    1       3       0x80a96cc    0x606cc      0x1a8         .got
--        0       0       0x4          0x4          
-+        0       0       0x4          0x4
- 
- [15]    6       3       0x80a9874    0x60874      0x80          .dynamic
--        4       0       0x4          0x8          
-+        4       0       0x4          0x8
- 
- [16]    8       3       0x80a98f4    0x608f4      0x449c        .bss
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [17]    2       0       0            0x608f4      0x9b90        .symtab
--        18      371     0x4          0x10         
-+        18      371     0x4          0x10
- 
- [18]    3       0       0            0x6a484      0x8526        .strtab
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [19]    3       0       0            0x729aa      0x93          .shstrtab
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [20]    1       0       0            0x72a3d      0x68b7        .comment
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- raid:/nfs/raid/src/dist-18.56/src> dump -h xemacs
- 
-@@ -166,67 +169,67 @@ xemacs:
-         Link    Info    Adralgn      Entsize
- 
- [1]     1       2       0x80480d4    0xd4         0x13          .interp
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [2]     5       2       0x80480e8    0xe8         0x388         .hash
--        3       0       0x4          0x4          
-+        3       0       0x4          0x4
- 
- [3]     11      2       0x8048470    0x470        0x7f0         .dynsym
--        4       1       0x4          0x10         
-+        4       1       0x4          0x10
- 
- [4]     3       2       0x8048c60    0xc60        0x3ad         .dynstr
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [5]     9       2       0x8049010    0x1010       0x338         .rel.plt
--        3       7       0x4          0x8          
-+        3       7       0x4          0x8
- 
- [6]     1       6       0x8049348    0x1348       0x3           .init
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [7]     1       6       0x804934c    0x134c       0x680         .plt
--        0       0       0x4          0x4          
-+        0       0       0x4          0x4
- 
- [8]     1       6       0x80499cc    0x19cc       0x3c56f       .text
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [9]     1       6       0x8085f3c    0x3df3c      0x3           .fini
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [10]    1       2       0x8085f40    0x3df40      0x69c         .rodata
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [11]    1       2       0x80865dc    0x3e5dc      0xd51         .rodata1
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [12]    1       3       0x8088330    0x3f330      0x20afc       .data
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [13]    1       3       0x80a8e2c    0x5fe2c      0x89d         .data1
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [14]    1       3       0x80a96cc    0x606cc      0x1a8         .got
--        0       0       0x4          0x4          
-+        0       0       0x4          0x4
- 
- [15]    6       3       0x80a9874    0x60874      0x80          .dynamic
--        4       0       0x4          0x8          
-+        4       0       0x4          0x8
- 
- [16]    8       3       0x80c6800    0x7d800      0             .bss
--        0       0       0x4          0            
-+        0       0       0x4          0
- 
- [17]    2       0       0            0x7d800      0x9b90        .symtab
--        18      371     0x4          0x10         
-+        18      371     0x4          0x10
- 
- [18]    3       0       0            0x87390      0x8526        .strtab
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [19]    3       0       0            0x8f8b6      0x93          .shstrtab
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [20]    1       0       0            0x8f949      0x68b7        .comment
--        0       0       0x1          0            
-+        0       0       0x1          0
- 
- [21]    1       3       0x80a98f4    0x608f4      0x1cf0c       .data
--        0       0       0x4          0            
-+        0       0       0x4          0
+@@ -49,11 +52,6 @@ what you give them.   Help stamp out sof
+  * The value you specify may be rounded down to a suitable boundary
+  * as required by the machine you are using.
+  *
+- * Specifying zero for data_start means the boundary between text and data
+- * should not be the same as when the program was loaded.
+- * If NO_REMAP is defined, the argument data_start is ignored and the
+- * segment boundaries are never changed.
+- *
+  * Bss_start indicates how much of the data segment is to be saved in the
+  * a.out file and restored when the program is executed.  It gives the lowest
+  * unsaved address, and is rounded up to a page boundary.  The default when 0
+@@ -63,9 +61,6 @@ what you give them.   Help stamp out sof
+  *
+  * The new file is set up to start at entry_address.
+  *
+- * If you make improvements I'd like to get them too.
+- * harpo!utah-cs!thomas, thomas@Utah-20
+- *
+  */
  
-  * This is an example of how the file header is changed.  "Shoff" is
-  * the section header offset within the file.  Since that table is
-@@ -276,20 +279,20 @@ temacs:
- Type        Offset      Vaddr       Paddr
- Filesz      Memsz       Flags       Align
- 
--6           0x34        0x8048034   0           
--0xa0        0xa0        5           0           
-+6           0x34        0x8048034   0
-+0xa0        0xa0        5           0
- 
--3           0xd4        0           0           
--0x13        0           4           0           
-+3           0xd4        0           0
-+0x13        0           4           0
- 
--1           0x34        0x8048034   0           
--0x3f2f9     0x3f2f9     5           0x1000      
-+1           0x34        0x8048034   0
-+0x3f2f9     0x3f2f9     5           0x1000
- 
--1           0x3f330     0x8088330   0           
--0x215c4     0x25a60     7           0x1000      
-+1           0x3f330     0x8088330   0
-+0x215c4     0x25a60     7           0x1000
- 
--2           0x60874     0x80a9874   0           
--0x80        0           7           0           
-+2           0x60874     0x80a9874   0
-+0x80        0           7           0
- 
- raid:/nfs/raid/src/dist-18.56/src> dump -o xemacs
- 
-@@ -298,42 +301,42 @@ xemacs:
- Type        Offset      Vaddr       Paddr
- Filesz      Memsz       Flags       Align
- 
--6           0x34        0x8048034   0           
--0xa0        0xa0        5           0           
-+6           0x34        0x8048034   0
-+0xa0        0xa0        5           0
- 
--3           0xd4        0           0           
--0x13        0           4           0           
-+3           0xd4        0           0
-+0x13        0           4           0
- 
--1           0x34        0x8048034   0           
--0x3f2f9     0x3f2f9     5           0x1000      
-+1           0x34        0x8048034   0
-+0x3f2f9     0x3f2f9     5           0x1000
- 
--1           0x3f330     0x8088330   0           
--0x3e4d0     0x3e4d0     7           0x1000      
-+1           0x3f330     0x8088330   0
-+0x3e4d0     0x3e4d0     7           0x1000
- 
--2           0x60874     0x80a9874   0           
--0x80        0           7           0           
-+2           0x60874     0x80a9874   0
-+0x80        0           7           0
+ /* Even more heavily modified by james%bigtex.cactus.org@localhost of Dell Computer Co.
+@@ -315,25 +310,25 @@ Filesz      Memsz       Flags       Alig
  
  
   */
- 
+-
 -/* Modified by wtien%urbana.mcd.mot.com@localhost of Motorola Inc. 
 - * 
++
 +/* Modified by wtien%urbana.mcd.mot.com@localhost of Motorola Inc.
 + *
   * The above mechanism does not work if the unexeced ELF file is being
@@ -325,7 +119,7 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
   * 1. ELF header e_shstrndx field.
   * 2. section header sh_link and sh_info field.
   * 3. symbol table entry st_shndx field.
-@@ -345,67 +348,67 @@ Filesz      Memsz       Flags       Alig
+@@ -345,85 +340,214 @@ Filesz      Memsz       Flags       Alig
          Link    Info    Adralgn      Entsize
  
  [1]     1       2       0x80480d4    0xd4         0x13          .interp
@@ -414,7 +208,35 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
  
   */
  
-@@ -417,15 +420,130 @@ Filesz      Memsz       Flags       Alig
++/*
++ * Modified by rdh%yottayotta.com@localhost of Yotta Yotta Incorporated.
++ * 
++ * The code originally used mmap() to create a memory image of the new
++ * and old object files.  This had a few handy features: (1) you get
++ * to use a cool system call like mmap, (2) no need to explicitly
++ * write out the new file before the close, and (3) no swap space
++ * requirements.  Unfortunately, mmap() often fails to work with
++ * nfs-mounted file systems.
++ *
++ * So, instead of relying on the vm subsystem to do the file i/o for
++ * us, it's now done explicitly.  A buffer of the right size for the
++ * file is dynamically allocated, and either the old_name is read into
++ * it, or it is initialized with the correct new executable contents,
++ * and then written to new_name.
++ */
++
++#ifndef emacs
++#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
++#include <string.h>
++#else
++#include "config.h"
++#endif
++
+ #include <sys/types.h>
+ #include <stdio.h>
+ #include <sys/stat.h>
+ #include <memory.h>
+-#include <string.h>
  #include <errno.h>
  #include <unistd.h>
  #include <fcntl.h>
@@ -422,10 +244,34 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
  #include <elf.h>
 +#endif
  #include <sys/mman.h>
+-
+-#ifndef emacs
+-#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
 +#if defined (__sony_news) && defined (_SYSTYPE_SYSV)
 +#include <sys/elf_mips.h>
 +#include <sym.h>
 +#endif /* __sony_news && _SYSTYPE_SYSV */
++#if __sgi
++#include <syms.h> /* for HDRR declaration */
++#endif /* __sgi */
++
++#ifndef MAP_ANON
++#ifdef MAP_ANONYMOUS
++#define MAP_ANON MAP_ANONYMOUS
+ #else
+-extern void fatal (char *, ...);
++#define MAP_ANON 0
++#endif
++#endif
++
++#ifdef MCPATH                 /* hir, 1993.8.4 */
++#undef open
++#undef chmod
++#endif  
++
++#ifndef MAP_FAILED
++#define MAP_FAILED ((void *) -1)
++#endif
 +
 +#if defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)
 +/* Declare COFF debugging symbol table.  This used to be in
@@ -466,51 +312,27 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +/*
 + * NetBSD does not have normal-looking user-land ELF support.
 + */
-+# if defined(__alpha__) || defined(__x86_64__) || defined(__sparc64__) || defined(_LP64)
-+#  define ELFSIZE     64
-+# else
-+#  define ELFSIZE     32
-+# endif
 +# include <sys/exec_elf.h>
 +
-+#ifndef PT_LOAD
-+# define PT_LOAD      Elf_pt_load
-+# define SHT_SYMTAB   Elf_sht_symtab
-+# define SHT_DYNSYM   Elf_sht_dynsym
-+# define SHT_NULL     Elf_sht_null
-+# define SHT_NOBITS   Elf_sht_nobits
-+# define SHT_REL      Elf_sht_rel
-+# define SHT_RELA     Elf_sht_rela
-+
-+# define SHN_UNDEF    Elf_eshn_undefined
-+# define SHN_ABS      Elf_eshn_absolute
-+# define SHN_COMMON   Elf_eshn_common
-+#endif
-+
-+/*
-+ * The magic of picking the right size types is handled by the ELFSIZE
-+ * definition above.
-+ */
-+# ifdef __STDC__
-+#  define ElfW(type)    Elf_##type
-+# else
-+#  define ElfW(type)    Elf_/**/type
-+# endif
-+
-+# ifdef __alpha__
-+#  include <sys/exec_ecoff.h>
-+#  define HDRR                struct ecoff_symhdr
-+#  define pHDRR               HDRR *
-+# endif /* __alpha__*/
-+
-+# ifdef __mips__
-+#  define SHT_MIPS_DEBUG      DT_MIPS_FLAGS
-+#  define HDRR                struct Elf_Shdr
-+# endif /* __mips__ */
++# ifndef PT_LOAD
++#  define PT_LOAD     Elf_pt_load
++#  if 0                                               /* was in pkgsrc patches for 20.7 */
++#   define SHT_PROGBITS Elf_sht_progbits
++#  endif
++#  define SHT_SYMTAB  Elf_sht_symtab
++#  define SHT_DYNSYM  Elf_sht_dynsym
++#  define SHT_NULL    Elf_sht_null
++#  define SHT_NOBITS  Elf_sht_nobits
++#  define SHT_REL     Elf_sht_rel
++#  define SHT_RELA    Elf_sht_rela
++
++#  define SHN_UNDEF   Elf_eshn_undefined
++#  define SHN_ABS     Elf_eshn_absolute
++#  define SHN_COMMON  Elf_eshn_common
++# endif /* !PT_LOAD */
 +
 +#endif /* __NetBSD__ */
 +
-+
 +#ifdef __OpenBSD__
 +# include <sys/exec_elf.h>
 +#endif
@@ -521,35 +343,28 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +
 +#ifndef ElfW
 +# ifdef __STDC__
-+#  define ElfW(type)  Elf32_##type
++#  define ElfBitsW(bits, type) Elf##bits##_##type
 +# else
-+#  define ElfW(type)  Elf32_/**/type
++#  define ElfBitsW(bits, type) Elf/**/bits/**/_/**/type
 +# endif
-+#endif
- 
- #ifndef emacs
- #define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
- #else
-+#include <config.h>
- extern void fatal (char *, ...);
++# ifndef ELFSIZE
++#  ifdef _LP64
++#   define ELFSIZE 64
++#  else
++#   define ELFSIZE 32
++#  endif
++# endif
++  /* This macro expands `bits' before invoking ElfBitsW.  */
++# define ElfExpandBitsW(bits, type) ElfBitsW (bits, type)
++# define ElfW(type) ElfExpandBitsW (ELFSIZE, type)
  #endif
  
-+#if defined ( __sony_news) && defined (_SYSTYPE_SYSV)
-+# define HAVE_MIPS_SBSS
-+#endif
-+
-+#if (defined (__mips__) || defined (__powerpc__)) && (defined(__NetBSD__) || defined(__OpenBSD__))
-+# define HAVE_MIPS_SBSS
-+#endif
-+
  #ifndef ELF_BSS_SECTION_NAME
- #define ELF_BSS_SECTION_NAME ".bss"
- #endif
-@@ -433,15 +551,38 @@ extern void fatal (char *, ...);
+@@ -433,15 +557,38 @@ extern void fatal (char *, ...);
  /* Get the address of a particular section or program header entry,
   * accounting for the size of the entries.
   */
-+/* 
++/*
 +   On PPC Reference Platform running Solaris 2.5.1
 +   the plt section is also of type NOBI like the bss section.
 +   (not really stored) and therefore sections after the bss
@@ -558,7 +373,7 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +   Thus, we modify the test from
 +      if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
 +   to
-+      if (NEW_SECTION_H (nn).sh_offset >= 
++      if (NEW_SECTION_H (nn).sh_offset >=
 +               OLD_SECTION_H (old_bss_index-1).sh_offset)
 +   This is just a hack. We should put the new data section
 +   before the .plt section.
@@ -588,67 +403,78 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
  
  #define PATCH_INDEX(n) \
    do { \
-@@ -451,9 +592,9 @@ typedef unsigned char byte;
+@@ -451,9 +598,8 @@ typedef unsigned char byte;
  
  /* Round X up to a multiple of Y.  */
  
 -int
-+ElfW(Addr)
- round_up (x, y)
+-round_up (x, y)
 -     int x, y;
-+     ElfW(Addr) x, y;
++static ElfW(Addr)
++round_up (ElfW(Addr) x, ElfW(Addr) y)
  {
    int rem = x % y;
    if (rem == 0)
-@@ -461,6 +602,47 @@ round_up (x, y)
+@@ -461,6 +607,39 @@ round_up (x, y)
    return x - rem + y;
  }
  
-+#if defined(__alpha__) || (defined ( __sony_news) && defined (_SYSTYPE_SYSV))
-+/* We are using  ECOFF symbols embedded in ELF. */
++/* Return the index of the section named NAME.
++   SECTION_NAMES, FILE_NAME and FILE_H give information
++   about the file we are looking in.
 +
-+void
-+relocate_ecoff_symhdr(symhdr, diff)
-+    HDRR *symhdr;
-+    ElfW(Word) diff;
-+{
-+  symhdr->cbLineOffset += diff;
-+  symhdr->cbDnOffset   += diff;
-+  symhdr->cbPdOffset   += diff;
-+  symhdr->cbSymOffset  += diff;
-+  symhdr->cbOptOffset  += diff;
-+  symhdr->cbAuxOffset  += diff;
-+  symhdr->cbSsOffset   += diff;
-+  symhdr->cbSsExtOffset += diff;
-+  symhdr->cbFdOffset   += diff;
-+  symhdr->cbRfdOffset  += diff;
-+  symhdr->cbExtOffset  += diff;
-+}
-+#endif /* __alpha__ or __sony_news and systype_sysv */
++   If we don't find the section NAME, that is a fatal error
++   if NOERROR is 0; we return -1 if NOERROR is nonzero.  */
 +
-+#ifdef notyet
-+void
-+relocate_elf_proghdr(p, diff)
-+    HDRR *symhdr;
-+    ElfW(Word) diff;
++static int
++find_section (char *name, char *section_names, char *file_name, ElfW(Ehdr) *old_file_h, ElfW(Shdr) *old_section_h, int noerror)
 +{
-+      phdr->sh_name  += diff;
-+      phdr->sh_type  += diff;
-+      phdr->sh_flags += diff;
-+      phdr->sh_addr  += diff;
-+      phdr->sh_offset += diff;
-+      phdr->sh_size  += diff;
-+      phdr->sh_link  += diff;
-+      phdr->sh_info  += diff;
-+      phdr->sh_addralign += diff;
-+      phdr->sh_entsize += diff;
-+};
-+#endif /* notyet */
++  int idx;
++
++  for (idx = 1; idx < old_file_h->e_shnum; idx++)
++    {
++#ifdef DEBUG
++      fprintf (stderr, "Looking for %s - found %s\n", name,
++             section_names + OLD_SECTION_H (idx).sh_name);
++#endif
++      if (!strcmp (section_names + OLD_SECTION_H (idx).sh_name,
++                 name))
++      break;
++    }
++  if (idx == old_file_h->e_shnum)
++    {
++      if (noerror)
++      return -1;
++      else
++      fatal ("Can't find %s in %s.\n", name, file_name);
++    }
++
++  return idx;
++}
 +
  /* ****************************************************************
   * unexec
   *
-@@ -483,19 +665,23 @@ unexec (new_name, old_name, data_start, 
+@@ -471,34 +650,45 @@ round_up (x, y)
+  *
+  */
+ void
+-unexec (new_name, old_name, data_start, bss_start, entry_address)
+-     char *new_name, *old_name;
+-     unsigned data_start, bss_start, entry_address;
++unexec (char *new_name, char *old_name, unsigned data_start, unsigned bss_start, unsigned entry_address)
+ {
+   int new_file, old_file, new_file_size;
+ 
+   /* Pointers to the base of the image of the two files. */
+   caddr_t old_base, new_base;
+ 
++#if MAP_ANON == 0
++  int mmap_fd;
++#else
++# define mmap_fd -1
++#endif
++
    /* Pointers to the file, program and section headers for the old and new
     * files.
     */
@@ -666,30 +492,57 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 -  Elf32_Word old_bss_size, new_data2_size;
 -  Elf32_Off  new_data2_offset;
 -  Elf32_Addr new_data2_addr;
+-
+-  int n, nn, old_bss_index, old_data_index, new_data2_index;
 +  ElfW(Addr) old_bss_addr, new_bss_addr;
 +  ElfW(Word) old_bss_size, new_data2_size;
 +  ElfW(Off)  new_data2_offset;
 +  ElfW(Addr) new_data2_addr;
- 
-   int n, nn, old_bss_index, old_data_index, new_data2_index;
-+#ifdef HAVE_MIPS_SBSS
-+  int old_sbss_index, old_mdebug_index;
-+  int bss_phdr_index;
-+#endif /* HAVE_MIPS_SBSS */
++  ElfW(Off) old_bss_offset;
++  ElfW(Word) new_data2_incr, new_data2_shincr;
++
++  int n, nn;
++  int old_bss_index, old_sbss_index;
++  int old_data_index, new_data2_index;
++  int old_mdebug_index;
    struct stat stat_buf;
++  int old_file_size;
  
-   /* Open the old file & map it into the address space. */
-@@ -508,7 +694,8 @@ unexec (new_name, old_name, data_start, 
+-  /* Open the old file & map it into the address space. */
++  /* Open the old file, allocate a buffer of the right size, and read
++   * in the file contents. */
+ 
+   old_file = open (old_name, O_RDONLY);
+ 
+@@ -508,90 +698,127 @@ unexec (new_name, old_name, data_start, 
    if (fstat (old_file, &stat_buf) == -1)
      fatal ("Can't fstat (%s): errno %d\n", old_name, errno);
  
 -  old_base = mmap (0, stat_buf.st_size, PROT_READ, MAP_SHARED, old_file, 0);
-+  old_base = mmap ((caddr_t) 0, stat_buf.st_size, PROT_READ, MAP_SHARED,
-+                 old_file, 0);
++#if MAP_ANON == 0
++  mmap_fd = open ("/dev/zero", O_RDONLY);
++  if (mmap_fd < 0)
++    fatal ("Can't open /dev/zero for reading: errno %d\n", errno);
++#endif
  
-   if (old_base == (caddr_t) -1)
-     fatal ("Can't mmap (%s): errno %d\n", old_name, errno);
-@@ -520,9 +707,9 @@ unexec (new_name, old_name, data_start, 
+-  if (old_base == (caddr_t) -1)
+-    fatal ("Can't mmap (%s): errno %d\n", old_name, errno);
++  /* We cannot use malloc here because that may use sbrk.  If it does,
++     we'd dump our temporary buffers with Emacs, and we'd have to be
++     extra careful to use the correct value of sbrk(0) after
++     allocating all buffers in the code below, which we aren't.  */
++  old_file_size = stat_buf.st_size;
++  old_base = mmap (NULL, old_file_size, PROT_READ | PROT_WRITE,
++                 MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
++  if (old_base == MAP_FAILED)
++    fatal ("Can't allocate buffer for %s\n", old_name);
+ 
+-#ifdef DEBUG
+-  fprintf (stderr, "mmap (%s, %x) -> %x\n", old_name, stat_buf.st_size,
+-         old_base);
+-#endif
++  if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size)
++    fatal ("Didn't read all of %s: errno %d\n", old_name, errno);
  
    /* Get pointers to headers & section names */
  
@@ -702,57 +555,61 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
    old_section_names = (char *) old_base
      + OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset;
  
-@@ -544,16 +731,61 @@ unexec (new_name, old_name, data_start, 
-   if (old_bss_index == old_file_h->e_shnum)
-     fatal ("Can't find .bss in %s.\n", old_name, 0);
- 
-+#ifdef HAVE_MIPS_SBSS
-+  for (old_sbss_index = 1; old_sbss_index < (int) old_file_h->e_shnum;
-+       old_sbss_index++)
-+    {
-+#ifdef DEBUG
-+      fprintf (stderr, "Looking for .sbss - found %s\n",
-+             old_section_names + OLD_SECTION_H (old_sbss_index).sh_name);
-+#endif
-+      if (!strcmp (old_section_names + OLD_SECTION_H (old_sbss_index).sh_name,
-+                 ".sbss"))
-+      break;
-+    }
-+  if (old_sbss_index == old_file_h->e_shnum)
-+    {
-+      old_bss_addr = OLD_SECTION_H(old_bss_index).sh_addr;
-+      old_bss_size = OLD_SECTION_H(old_bss_index).sh_size;
-+      new_data2_offset = OLD_SECTION_H(old_bss_index).sh_offset;
++  /* Find the mdebug section, if any.  */
++
++  old_mdebug_index = find_section (".mdebug", old_section_names,
++                                 old_name, old_file_h, old_section_h, 1);
++
+   /* Find the old .bss section.  Figure out parameters of the new
+    * data2 and bss sections.
+    */
+ 
+-  for (old_bss_index = 1; old_bss_index < (int) old_file_h->e_shnum;
+-       old_bss_index++)
++  old_bss_index = find_section (".bss", old_section_names,
++                              old_name, old_file_h, old_section_h, 0);
++
++  old_sbss_index = find_section (".sbss", old_section_names,
++                               old_name, old_file_h, old_section_h, 1);
++  if (old_sbss_index != -1)
++    if (OLD_SECTION_H (old_sbss_index).sh_type == SHT_PROGBITS)
++      old_sbss_index = -1;
++
++  if (old_sbss_index == -1)
+     {
+-#ifdef DEBUG
+-      fprintf (stderr, "Looking for .bss - found %s\n",
+-             old_section_names + OLD_SECTION_H (old_bss_index).sh_name);
+-#endif
+-      if (!strcmp (old_section_names + OLD_SECTION_H (old_bss_index).sh_name,
+-                 ELF_BSS_SECTION_NAME))
+-      break;
++      old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
++      old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
++      old_bss_offset = OLD_SECTION_H (old_bss_index).sh_offset;
 +      new_data2_index = old_bss_index;
 +    }
 +  else
 +    {
-+      old_bss_addr = OLD_SECTION_H(old_sbss_index).sh_addr;
-+      old_bss_size = OLD_SECTION_H(old_bss_index).sh_size
-+      + OLD_SECTION_H(old_sbss_index).sh_size;
-+      new_data2_offset = OLD_SECTION_H(old_sbss_index).sh_offset;
++      old_bss_addr = OLD_SECTION_H (old_sbss_index).sh_addr;
++      old_bss_size = OLD_SECTION_H (old_bss_index).sh_size
++      + OLD_SECTION_H (old_sbss_index).sh_size;
++      old_bss_offset = OLD_SECTION_H (old_sbss_index).sh_offset;
 +      new_data2_index = old_sbss_index;
-+    }
-+
-+  for (old_mdebug_index = 1; old_mdebug_index < (int) old_file_h->e_shnum;
-+       old_mdebug_index++)
-+    {
-+#ifdef DEBUG
-+      fprintf (stderr, "Looking for .mdebug - found %s\n",
-+             old_section_names + OLD_SECTION_H (old_mdebug_index).sh_name);
-+#endif
-+      if (!strcmp (old_section_names + OLD_SECTION_H (old_mdebug_index).sh_name,
-+                 ".mdebug"))
-+      break;
-+    }
-+    if (old_mdebug_index == old_file_h->e_shnum)
-+      old_mdebug_index = 0;
-+#else /* not HAVE_MIPS_SBSS */
-   old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
-   old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
+     }
+-  if (old_bss_index == old_file_h->e_shnum)
+-    fatal ("Can't find .bss in %s.\n", old_name, 0);
+ 
+-  old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
+-  old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
 -#if defined(emacs) || !defined(DEBUG)
 -  new_bss_addr = (Elf32_Addr) sbrk (0);
-+#endif /* not HAVE_MIPS_SBSS */
++  /* Find the old .data section.  Figure out parameters of
++     the new data2 and bss sections.  */
++
++  old_data_index = find_section (".data", old_section_names,
++                               old_name, old_file_h, old_section_h, 0);
++
 +#if defined (emacs) || !defined (DEBUG)
 +  new_bss_addr = (ElfW(Addr)) sbrk (0);
  #else
@@ -760,72 +617,131 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
  #endif
    new_data2_addr = old_bss_addr;
    new_data2_size = new_bss_addr - old_bss_addr;
-+#ifndef HAVE_MIPS_SBSS
-   new_data2_offset = OLD_SECTION_H (old_bss_index).sh_offset;
-+#endif /*  not HAVE_MIPS_SBSS */
+-  new_data2_offset = OLD_SECTION_H (old_bss_index).sh_offset;
++  new_data2_offset = OLD_SECTION_H (old_data_index).sh_offset
++    + (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr);
++  /* This is the amount by which the sections following the bss sections
++     must be shifted in the image.  It can differ from new_data2_size if
++     the end of the old .data section (and thus the offset of the .bss
++     section) was unaligned.  */
++  new_data2_incr = new_data2_size + (new_data2_offset - old_bss_offset);
++  new_data2_shincr = round_up(new_data2_incr, old_program_h->p_align);
  
  #ifdef DEBUG
    fprintf (stderr, "old_bss_index %d\n", old_bss_index);
-@@ -582,15 +814,20 @@ unexec (new_name, old_name, data_start, 
+   fprintf (stderr, "old_bss_addr %x\n", old_bss_addr);
+   fprintf (stderr, "old_bss_size %x\n", old_bss_size);
++  fprintf (stderr, "old_bss_offset %x\n", old_bss_offset);
+   fprintf (stderr, "new_bss_addr %x\n", new_bss_addr);
+   fprintf (stderr, "new_data2_addr %x\n", new_data2_addr);
+   fprintf (stderr, "new_data2_size %x\n", new_data2_size);
+   fprintf (stderr, "new_data2_offset %x\n", new_data2_offset);
++  fprintf (stderr, "new_data2_incr %x\n", new_data2_incr);
+ #endif
+ 
+   if ((unsigned) new_bss_addr < (unsigned) old_bss_addr + old_bss_size)
+     fatal (".bss shrank when undumping???\n", 0, 0);
+ 
+-  /* Set the output file to the right size and mmap it.  Set
+-   * pointers to various interesting objects.  stat_buf still has
+-   * old_file data.
++  /* Set the output file to the right size.  Allocate a buffer to hold
++   * the image of the new file.  Set pointers to various interesting
++   * objects.  stat_buf still has old_file data.
+    */
+ 
+   new_file = open (new_name, O_RDWR | O_CREAT, 0666);
+   if (new_file < 0)
+     fatal ("Can't creat (%s): errno %d\n", new_name, errno);
+ 
+-  new_file_size = stat_buf.st_size + old_file_h->e_shentsize + new_data2_size;
++  new_file_size = stat_buf.st_size + old_file_h->e_shentsize + new_data2_shincr;
+ 
    if (ftruncate (new_file, new_file_size))
      fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno);
  
 -  new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_SHARED,
 -                 new_file, 0);
-+#ifdef UNEXEC_USE_MAP_PRIVATE
-+  new_base = mmap ((caddr_t) 0, new_file_size, PROT_READ | PROT_WRITE,
-+                 MAP_PRIVATE, new_file, 0);
-+#else
-+  new_base = mmap ((caddr_t) 0, new_file_size, PROT_READ | PROT_WRITE,
-+                 MAP_SHARED, new_file, 0);
-+#endif
- 
-   if (new_base == (caddr_t) -1)
-     fatal ("Can't mmap (%s): errno %d\n", new_name, errno);
- 
+-
+-  if (new_base == (caddr_t) -1)
+-    fatal ("Can't mmap (%s): errno %d\n", new_name, errno);
+-
 -  new_file_h = (Elf32_Ehdr *) new_base;
 -  new_program_h = (Elf32_Phdr *) ((byte *) new_base + old_file_h->e_phoff);
 -  new_section_h = (Elf32_Shdr *)
+-    ((byte *) new_base + old_file_h->e_shoff + new_data2_size);
++  new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE,
++                 MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
++  if (new_base == MAP_FAILED)
++    fatal ("Can't allocate buffer for %s\n", old_name);
++
 +  new_file_h = (ElfW(Ehdr) *) new_base;
 +  new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff);
 +  new_section_h = (ElfW(Shdr) *)
-     ((byte *) new_base + old_file_h->e_shoff + new_data2_size);
++    ((byte *) new_base + old_file_h->e_shoff + new_data2_shincr);
  
    /* Make our new file, program and section headers as copies of the
-@@ -633,8 +870,14 @@ unexec (new_name, old_name, data_start, 
+    * originals.
+@@ -608,7 +835,7 @@ unexec (new_name, old_name, data_start, 
+    * further away now.
+    */
+ 
+-  new_file_h->e_shoff += new_data2_size;
++  new_file_h->e_shoff += new_data2_shincr;
+   new_file_h->e_shnum += 1;
+ 
+ #ifdef DEBUG
+@@ -629,12 +856,22 @@ unexec (new_name, old_name, data_start, 
+   for (n = new_file_h->e_phnum - 1; n >= 0; n--)
+     {
+       /* Compute maximum of all requirements for alignment of section.  */
+-      int alignment = (NEW_PROGRAM_H (n)).p_align;
++      ElfW(Word) alignment = (NEW_PROGRAM_H (n)).p_align;
        if ((OLD_SECTION_H (old_bss_index)).sh_addralign > alignment)
        alignment = OLD_SECTION_H (old_bss_index).sh_addralign;
  
-+#ifdef HAVE_MIPS_SBSS
+-      if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz > old_bss_addr)
+-      fatal ("Program segment above .bss in %s\n", old_name, 0);
++#ifdef __sgi
++        /* According to r02kar%x4u2.desy.de@localhost (Karsten Kuenne)
++           and oliva%gnu.org@localhost (Alexandre Oliva), on IRIX 5.2, we
++           always get "Program segment above .bss" when dumping
++           when the executable doesn't have an sbss section.  */
++      if (old_sbss_index != -1)
++#endif /* __sgi */
 +      if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz
-+        > round_up (old_bss_addr, alignment))
-+      fatal ("Program segment above .bss in %s\n", old_name, 0);
-+#else /* not HAVE_MIPS_SBSS */
-       if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz > old_bss_addr)
-       fatal ("Program segment above .bss in %s\n", old_name, 0);
-+#endif /* not HAVE_MIPS_SBSS */
++        > (old_sbss_index == -1
++           ? old_bss_addr
++           : round_up (old_bss_addr, alignment)))
++        fatal ("Program segment above .bss in %s\n", old_name, 0);
  
        if (NEW_PROGRAM_H (n).p_type == PT_LOAD
          && (round_up ((NEW_PROGRAM_H (n)).p_vaddr
-@@ -646,9 +889,16 @@ unexec (new_name, old_name, data_start, 
+@@ -646,10 +883,12 @@ unexec (new_name, old_name, data_start, 
    if (n < 0)
      fatal ("Couldn't find segment next to .bss in %s\n", old_name, 0);
  
 -  NEW_PROGRAM_H (n).p_filesz += new_data2_size;
-+#ifdef HAVE_MIPS_SBSS
-+  bss_phdr_index = n;
-+#endif
-+
 +  /* Make sure that the size includes any padding before the old .bss
 +     section.  */
 +  NEW_PROGRAM_H (n).p_filesz = new_bss_addr - NEW_PROGRAM_H (n).p_vaddr;
    NEW_PROGRAM_H (n).p_memsz = NEW_PROGRAM_H (n).p_filesz;
  
-+
- #if 0 /* Maybe allow section after data2 - does this ever happen? */
+-#if 0 /* Maybe allow section after data2 - does this ever happen? */
++#ifdef IRIX5 /* allow section after data2 */
    for (n = new_file_h->e_phnum - 1; n >= 0; n--)
      {
-@@ -675,18 +925,27 @@ unexec (new_name, old_name, data_start, 
+       if (NEW_PROGRAM_H (n).p_vaddr
+@@ -657,7 +896,7 @@ unexec (new_name, old_name, data_start, 
+       NEW_PROGRAM_H (n).p_vaddr += new_data2_size - old_bss_size;
+ 
+       if (NEW_PROGRAM_H (n).p_offset >= new_data2_offset)
+-      NEW_PROGRAM_H (n).p_offset += new_data2_size;
++      NEW_PROGRAM_H (n).p_offset += new_data2_incr;
+     }
+ #endif
+ 
+@@ -675,18 +914,20 @@ unexec (new_name, old_name, data_start, 
    if (old_data_index == old_file_h->e_shnum)
      fatal ("Can't find .data in %s.\n", old_name, 0);
  
@@ -837,17 +753,10 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
        caddr_t src;
 -      /* If it is bss section, insert the new data2 section before it. */
 -      if (n == old_bss_index)
-+      int temp_index;
-+#ifdef HAVE_MIPS_SBSS
 +      /* If it is (s)bss section, insert the new data2 section before it.  */
 +      /* new_data2_index is the index of either old_sbss or old_bss, that was
 +       chosen as a section for new_data2.   */
-+      temp_index = new_data2_index;
-+#else /* not HAVE_MIPS_SBSS */
-+      /* If it is bss section, insert the new data2 section before it.  */
-+      temp_index = old_bss_index;
-+#endif /* not HAVE_MIPS_SBSS */
-+      if (n == temp_index)
++      if (n == new_data2_index)
        {
          /* Steal the data section header for this data2 section. */
          memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index),
@@ -857,7 +766,7 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
          NEW_SECTION_H (nn).sh_addr = new_data2_addr;
          NEW_SECTION_H (nn).sh_offset = new_data2_offset;
          NEW_SECTION_H (nn).sh_size = new_data2_size;
-@@ -696,37 +955,87 @@ unexec (new_name, old_name, data_start, 
+@@ -696,73 +937,235 @@ unexec (new_name, old_name, data_start, 
          NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (n).sh_addralign;
  
          /* Now copy over what we have in the memory now. */
@@ -873,49 +782,29 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +
 +      memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n),
              old_file_h->e_shentsize);
-       
+-      
 -      /* The new bss section's size is zero, and its file offset and virtual
 -       address should be off by NEW_DATA2_SIZE. */
 -      if (n == old_bss_index)
++
 +      if (n == old_bss_index
-+#ifdef HAVE_MIPS_SBSS
 +        /* The new bss and sbss section's size is zero, and its file offset
 +           and virtual address should be off by NEW_DATA2_SIZE.  */
 +        || n == old_sbss_index
-+#endif /* HAVE_MIPS_SBSS */
 +        )
        {
-         /* NN should be `old_bss_index + 1' at this point. */
-         NEW_SECTION_H (nn).sh_offset += new_data2_size;
-         NEW_SECTION_H (nn).sh_addr += new_data2_size;
+-        /* NN should be `old_bss_index + 1' at this point. */
+-        NEW_SECTION_H (nn).sh_offset += new_data2_size;
+-        NEW_SECTION_H (nn).sh_addr += new_data2_size;
++        /* NN should be `old_s?bss_index + 1' at this point. */
++        NEW_SECTION_H (nn).sh_offset = new_data2_offset + new_data2_size;
++        NEW_SECTION_H (nn).sh_addr = new_data2_addr + new_data2_size;
          /* Let the new bss section address alignment be the same as the
 -           section address alignment followed the old bss section, so 
 +           section address alignment followed the old bss section, so
             this section will be placed in exactly the same place. */
          NEW_SECTION_H (nn).sh_addralign = OLD_SECTION_H (nn).sh_addralign;
          NEW_SECTION_H (nn).sh_size = 0;
-+
-+#ifdef HAVE_MIPS_SBSS
-+        /* On ELF mips,  the new data section replaces both .sbss and .bss
-+           (we have, after all, written to them.).  Adding new_data2_size
-+           to the sh_addr and sh_offset of sbss puts sbss at the end of
-+           the new data section. setting the size to zero makes it empty.
-+           But then, adding the new_data2_size to the bss address puts
-+           its start  beyond the end of the original bss. If the sbss size
-+           was bigger than a page,  the bss ends up not covered by the
-+           program header.  This breaks strip. Since both sbss and bss
-+           are zero-sized,  just use the same address and file offset for
-+           both, guaranteeing other tools will assign them to the same
-+           program section (asssuming no sections are loaded at higher
-+           offsets.)  */
-+        if (n == old_bss_index) {
-+               int new_sbss_bss_padding = NEW_SECTION_H(nn).sh_addr -
-+                  NEW_SECTION_H(nn - 1).sh_addr;
-+              printf("sbss to bss offset =0x%x\n", new_sbss_bss_padding);
-+              NEW_SECTION_H(nn).sh_addr =NEW_SECTION_H(nn - 1).sh_addr;
-+              NEW_SECTION_H(nn).sh_offset =NEW_SECTION_H(nn - 1).sh_offset;
-+        }
-+#endif  /* HAVE_MIPS_SBSS */
        }
 -      /* Any section that was original placed AFTER the bss section should now
 -       be off by NEW_DATA2_SIZE. */
@@ -925,7 +814,12 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +      else
 +      {
 +        /* Any section that was original placed AFTER the bss
-+           section should now be off by NEW_DATA2_SIZE. */
++           section should now be off by NEW_DATA2_INCR.  If a
++           section overlaps the .bss section, consider it to be
++           placed after the .bss section.  Overlap can occur if the
++           section just before .bss has less-strict alignment; this
++           was observed between .symtab and .bss on Solaris 2.5.1
++           (sparc) with GCC snapshot 960602.  */
 +#ifdef SOLARIS_POWERPC
 +        /* On PPC Reference Platform running Solaris 2.5.1
 +           the plt section is also of type NOBI like the bss section.
@@ -937,12 +831,10 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +           Erik Deumens, deumens%qtp.ufl.edu@localhost.  */
 +        if (NEW_SECTION_H (nn).sh_offset
 +            >= OLD_SECTION_H (old_bss_index-1).sh_offset)
-+          NEW_SECTION_H (nn).sh_offset += new_data2_size;
++          NEW_SECTION_H (nn).sh_offset += new_data2_incr;
 +#else
-+        if (round_up (NEW_SECTION_H (nn).sh_offset,
-+                      OLD_SECTION_H (old_bss_index).sh_addralign)
-+            >= new_data2_offset)
-+          NEW_SECTION_H (nn).sh_offset += new_data2_size;
++        if (NEW_SECTION_H (nn).sh_offset >= old_bss_offset)
++          NEW_SECTION_H (nn).sh_offset += new_data2_incr;
 +#endif
 +        /* Any section that was originally placed after the section
 +           header table should now be off by the size of one section
@@ -960,7 +852,20 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
        PATCH_INDEX (NEW_SECTION_H (nn).sh_link);
        /* For symbol tables, info is a symbol table index,
         so don't change it.  */
-@@ -738,7 +1047,7 @@ unexec (new_name, old_name, data_start, 
+       if (NEW_SECTION_H (nn).sh_type != SHT_SYMTAB
+         && NEW_SECTION_H (nn).sh_type != SHT_DYNSYM)
+       PATCH_INDEX (NEW_SECTION_H (nn).sh_info);
++      
++      if (old_sbss_index != -1)
++      if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".sbss"))
++        {
++          NEW_SECTION_H (nn).sh_offset = 
++            round_up (NEW_SECTION_H (nn).sh_offset,
++                      NEW_SECTION_H (nn).sh_addralign);
++          NEW_SECTION_H (nn).sh_type = SHT_PROGBITS;
++        }
+ 
+       /* Now, start to copy the content of sections.  */
        if (NEW_SECTION_H (nn).sh_type == SHT_NULL
          || NEW_SECTION_H (nn).sh_type == SHT_NOBITS)
        continue;
@@ -969,20 +874,39 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
        /* Write out the sections. .data and .data1 (and data2, called
         ".data" in the strings table) get copied from the current process
         instead of the old file.  */
-@@ -747,22 +1056,54 @@ unexec (new_name, old_name, data_start, 
-         || !strcmp ((old_section_names + NEW_SECTION_H(n).sh_name),
-                     ".sdata")
- #endif
-+#ifdef HAVE_MIPS_SBSS
+       if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data")
+-#ifdef _nec_ews_svr4                          /* hir, 1994.6.13 */
+-        || !strcmp ((old_section_names + NEW_SECTION_H(n).sh_name),
 +        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
-+                    ".sdata")
+                     ".sdata")
 +        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
 +                    ".lit4")
 +        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
 +                    ".lit8")
-+#endif /* HAVE_MIPS_SBSS */
++        /* The conditional bit below was in Oliva's original code
++           (1999-08-25) and seems to have been dropped by mistake
++           subsequently.  It prevents a crash at startup under X in
++           `IRIX64 6.5 6.5.17m' with c_dev 7.3.1.3m.  It causes no
++           trouble on the other ELF platforms I could test (Irix
++           6.5.15m, Solaris 8, Debian Potato x86, Debian Woody
++           SPARC); however, it's reported to cause crashes under
++           some version of GNU/Linux.  It's not yet clear what's
++           changed in that Irix version to cause the problem, or why
++           the fix sometimes fails under GNU/Linux.  There's
++           probably no good reason to have something Irix-specific
++           here, but this will have to do for now.  IRIX6_5 is the
++           most specific macro we have to test.  -- fx 2002-10-01  */
++#ifdef IRIX6_5
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".got")
+ #endif
          || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
-                     ".data1"))
+-                    ".data1"))
++                    ".sdata1")
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".data1")
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".sbss"))
        src = (caddr_t) OLD_SECTION_H (n).sh_addr;
        else
        src = old_base + OLD_SECTION_H (n).sh_offset;
@@ -991,18 +915,30 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
        memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src,
              NEW_SECTION_H (nn).sh_size);
  
-+#ifdef __alpha__
++#if defined(__alpha__) && !defined(__NetBSD__)
 +      /* Update Alpha COFF symbol table: */
 +      if (strcmp (old_section_names + OLD_SECTION_H (n).sh_name, ".mdebug")
 +        == 0)
 +      {
 +        pHDRR symhdr = (pHDRR) (NEW_SECTION_H (nn).sh_offset + new_base);
-+        relocate_ecoff_symhdr(symhdr, new_data2_size);
++
++        symhdr->cbLineOffset += new_data2_size;
++        symhdr->cbDnOffset += new_data2_size;
++        symhdr->cbPdOffset += new_data2_size;
++        symhdr->cbSymOffset += new_data2_size;
++        symhdr->cbOptOffset += new_data2_size;
++        symhdr->cbAuxOffset += new_data2_size;
++        symhdr->cbSsOffset += new_data2_size;
++        symhdr->cbSsExtOffset += new_data2_size;
++        symhdr->cbFdOffset += new_data2_size;
++        symhdr->cbRfdOffset += new_data2_size;
++        symhdr->cbExtOffset += new_data2_size;
 +      }
 +#endif /* __alpha__ */
 +
 +#if defined (__sony_news) && defined (_SYSTYPE_SYSV)
-+      if (NEW_SECTION_H (nn).sh_type == SHT_MIPS_DEBUG && old_mdebug_index) 
++      if (NEW_SECTION_H (nn).sh_type == SHT_MIPS_DEBUG
++        && old_mdebug_index != -1) 
 +        {
 +        int diff = NEW_SECTION_H(nn).sh_offset 
 +              - OLD_SECTION_H(old_mdebug_index).sh_offset;
@@ -1010,10 +946,75 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +
 +        if (diff)
 +          {
-+            relocate_ecoff_symhdr(phdr, diff);
++            phdr->cbLineOffset += diff;
++            phdr->cbDnOffset   += diff;
++            phdr->cbPdOffset   += diff;
++            phdr->cbSymOffset  += diff;
++            phdr->cbOptOffset  += diff;
++            phdr->cbAuxOffset  += diff;
++            phdr->cbSsOffset   += diff;
++            phdr->cbSsExtOffset += diff;
++            phdr->cbFdOffset   += diff;
++            phdr->cbRfdOffset  += diff;
++            phdr->cbExtOffset  += diff;
++          }
++      }
++#endif /* __sony_news && _SYSTYPE_SYSV */
++
++#if __sgi
++      /* Adjust  the HDRR offsets in .mdebug and copy the 
++       line data if it's in its usual 'hole' in the object.
++       Makes the new file debuggable with dbx.
++       patches up two problems: the absolute file offsets
++       in the HDRR record of .mdebug (see /usr/include/syms.h), and
++       the ld bug that gets the line table in a hole in the
++       elf file rather than in the .mdebug section proper.
++       David Anderson. davea%sgi.com@localhost  Jan 16,1994.  */
++      if (n == old_mdebug_index)
++      {
++#define MDEBUGADJUST(__ct,__fileaddr)         \
++  if (n_phdrr->__ct > 0)                      \
++    {                                         \
++      n_phdrr->__fileaddr += movement;                \
++    }
++
++        HDRR * o_phdrr = (HDRR *)((byte *)old_base + OLD_SECTION_H (n).sh_offset);
++        HDRR * n_phdrr = (HDRR *)((byte *)new_base + NEW_SECTION_H (nn).sh_offset);
++        unsigned movement = new_data2_size;
++
++        MDEBUGADJUST (idnMax, cbDnOffset);
++        MDEBUGADJUST (ipdMax, cbPdOffset);
++        MDEBUGADJUST (isymMax, cbSymOffset);
++        MDEBUGADJUST (ioptMax, cbOptOffset);
++        MDEBUGADJUST (iauxMax, cbAuxOffset);
++        MDEBUGADJUST (issMax, cbSsOffset);
++        MDEBUGADJUST (issExtMax, cbSsExtOffset);
++        MDEBUGADJUST (ifdMax, cbFdOffset);
++        MDEBUGADJUST (crfd, cbRfdOffset);
++        MDEBUGADJUST (iextMax, cbExtOffset);
++        /* The Line Section, being possible off in a hole of the object,
++           requires special handling.  */
++        if (n_phdrr->cbLine > 0)
++          {
++            if (o_phdrr->cbLineOffset > (OLD_SECTION_H (n).sh_offset
++                                         + OLD_SECTION_H (n).sh_size))
++              {
++                /* line data is in a hole in elf. do special copy and adjust
++                   for this ld mistake.
++                   */
++                n_phdrr->cbLineOffset += movement;
++
++                memcpy (n_phdrr->cbLineOffset + new_base,
++                        o_phdrr->cbLineOffset + old_base, n_phdrr->cbLine);
++              }
++            else
++              {
++                /* somehow line data is in .mdebug as it is supposed to be.  */
++                MDEBUGADJUST (cbLine, cbLineOffset);
++              }
 +          }
 +      }
-+#endif /* __sony_news and systype_sysv */
++#endif /* __sgi */
 +
        /* If it is the symbol table, its st_shndx field needs to be patched.  */
        if (NEW_SECTION_H (nn).sh_type == SHT_SYMTAB
@@ -1027,7 +1028,7 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
                                           new_base);
          for (; num--; sym++)
            {
-@@ -770,7 +1111,7 @@ unexec (new_name, old_name, data_start, 
+@@ -770,7 +1173,7 @@ unexec (new_name, old_name, data_start, 
                  || (sym->st_shndx == SHN_ABS)
                  || (sym->st_shndx == SHN_COMMON))
                continue;
@@ -1036,7 +1037,7 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
              PATCH_INDEX (sym->st_shndx);
            }
        }
-@@ -780,22 +1121,72 @@ unexec (new_name, old_name, data_start, 
+@@ -780,30 +1183,101 @@ unexec (new_name, old_name, data_start, 
    for (n = new_file_h->e_shnum - 1; n; n--)
      {
        byte *symnames;
@@ -1064,6 +1065,7 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
          memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr));
      }
  
+-  /* Close the files and make the new file executable.  */
 +  /* This loop seeks out relocation sections for the data section, so
 +     that it can undo relocations performed by the runtime linker.  */
 +  for (n = new_file_h->e_shnum - 1; n; n--)
@@ -1080,6 +1082,18 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +      nn = section.sh_info;
 +      if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
 +          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".sdata")
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".lit4")
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".lit8")
++#ifdef IRIX6_5                        /* see above */
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".got")
++#endif
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".sdata1")
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
 +                      ".data1"))
 +        {
 +          ElfW(Addr) offset = NEW_SECTION_H (nn).sh_addr -
@@ -1102,15 +1116,34 @@ $NetBSD: patch-ab,v 1.3 2011/12/24 17:07
 +      break;
 +      }
 +    }
-+
-+#ifdef UNEXEC_USE_MAP_PRIVATE
-+  if (lseek (new_file, 0, SEEK_SET) == -1)
-+    fatal ("Can't rewind (%s): errno %d\n", new_name, errno);
+ 
+-  if (close (old_file))
+-    fatal ("Can't close (%s): errno %d\n", old_name, errno);
++  /* Write out new_file, close it, and free the buffer containing its
++   * contents */
 +
 +  if (write (new_file, new_base, new_file_size) != new_file_size)
-+    fatal ("Can't write (%s): errno %d\n", new_name, errno);
++    fatal ("Didn't write %d bytes to %s: errno %d\n", 
++         new_file_size, new_base, errno);
+ 
+   if (close (new_file))
+     fatal ("Can't close (%s): errno %d\n", new_name, errno);
+ 
++  munmap (new_base, new_file_size);
++
++  /* Close old_file, and free the corresponding buffer */
++
++#if MAP_ANON == 0
++  close (mmap_fd);
 +#endif
 +
-   /* Close the files and make the new file executable.  */
++  if (close (old_file))
++    fatal ("Can't close (%s): errno %d\n", old_name, errno);
++
++  munmap (old_base, old_file_size);
++
++  /* Make the new file executable */
++
+   if (stat (new_name, &stat_buf) == -1)
+     fatal ("Can't stat (%s): errno %d\n", new_name, errno);
  
-   if (close (old_file))



Home | Main Index | Thread Index | Old Index