diff options
author | tsutsui <tsutsui@pkgsrc.org> | 2017-04-29 01:11:55 +0000 |
---|---|---|
committer | tsutsui <tsutsui@pkgsrc.org> | 2017-04-29 01:11:55 +0000 |
commit | ba529541a546868a68c8d5b2a89609dff83bce2b (patch) | |
tree | 5896af719fa23d3b4aa5c4bcc4a225d2115e55cc | |
parent | b29dbabdff0c4161740a18cfd515f0228fe11d2e (diff) | |
download | pkgsrc-ba529541a546868a68c8d5b2a89609dff83bce2b.tar.gz |
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
-rw-r--r-- | editors/mule/Makefile | 4 | ||||
-rw-r--r-- | editors/mule/distinfo | 8 | ||||
-rw-r--r-- | editors/mule/patches/patch-aa | 17 | ||||
-rw-r--r-- | editors/mule/patches/patch-ab | 1025 | ||||
-rw-r--r-- | editors/mule/patches/patch-src_alloc_c | 35 |
5 files changed, 546 insertions, 543 deletions
diff --git a/editors/mule/Makefile b/editors/mule/Makefile index 8c45f7da3bb..b772f29301b 100644 --- a/editors/mule/Makefile +++ b/editors/mule/Makefile @@ -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}/${PKGMANDIR}/man1 .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 diff --git a/editors/mule/distinfo b/editors/mule/distinfo index cec855ab5fc..1f3b189d13c 100644 --- a/editors/mule/distinfo +++ b/editors/mule/distinfo @@ -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) = b4e74a5fc7ab5444dd48dcc6dc231d0382fb7621 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 diff --git a/editors/mule/patches/patch-aa b/editors/mule/patches/patch-aa index 18b8fe7f492..c73eddd8eb2 100644 --- a/editors/mule/patches/patch-aa +++ b/editors/mule/patches/patch-aa @@ -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:24 wiz Exp $ /* 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:24 wiz Exp $ /* 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:24 wiz Exp $ +/* 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 diff --git a/editors/mule/patches/patch-ab b/editors/mule/patches/patch-ab index fa96c94bb04..d33f630435d 100644 --- a/editors/mule/patches/patch-ab +++ b/editors/mule/patches/patch-ab @@ -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:07 dholland Exp $ * * 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 of Dell Computer Co. +@@ -315,25 +310,25 @@ Filesz Memsz Flags Alig */ - +- -/* Modified by wtien@urbana.mcd.mot.com of Motorola Inc. - * ++ +/* Modified by wtien@urbana.mcd.mot.com 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:07 dholland Exp $ * 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:07 dholland Exp $ */ -@@ -417,15 +420,130 @@ Filesz Memsz Flags Alig ++/* ++ * Modified by rdh@yottayotta.com 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:07 dholland Exp $ #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:07 dholland Exp $ +/* + * 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__*/ ++# 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 + -+# ifdef __mips__ -+# define SHT_MIPS_DEBUG DT_MIPS_FLAGS -+# define HDRR struct Elf_Shdr -+# endif /* __mips__ */ ++# 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:07 dholland Exp $ + +#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:07 dholland Exp $ + 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:07 dholland Exp $ #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:07 dholland Exp $ - 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. */ ++ /* Open the old file, allocate a buffer of the right size, and read ++ * in the file contents. */ + + old_file = open (old_name, O_RDONLY); - /* Open the old file & map it into the address space. */ -@@ -508,7 +694,8 @@ unexec (new_name, old_name, data_start, +@@ -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:07 dholland Exp $ 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); ++ /* 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. + */ -+#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; +- 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:07 dholland Exp $ #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 (Karsten Kuenne) ++ and oliva@gnu.org (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:07 dholland Exp $ 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:07 dholland Exp $ 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:07 dholland Exp $ + + 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:07 dholland Exp $ + 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:07 dholland Exp $ + Erik Deumens, deumens@qtp.ufl.edu. */ + 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:07 dholland Exp $ 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:07 dholland Exp $ /* 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:07 dholland Exp $ 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:07 dholland Exp $ + + 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 and systype_sysv */ ++#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 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 /* __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:07 dholland Exp $ 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:07 dholland Exp $ 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:07 dholland Exp $ 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:07 dholland Exp $ + 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:07 dholland Exp $ + 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)) diff --git a/editors/mule/patches/patch-src_alloc_c b/editors/mule/patches/patch-src_alloc_c index 6176ef83a93..94f0d8b68af 100644 --- a/editors/mule/patches/patch-src_alloc_c +++ b/editors/mule/patches/patch-src_alloc_c @@ -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/24 17:07:07 dholland Exp $ #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; |