diff options
author | Matthew Kennedy <mkennedy@gentoo.org> | 2004-05-13 15:27:43 +0000 |
---|---|---|
committer | Matthew Kennedy <mkennedy@gentoo.org> | 2004-05-13 15:27:43 +0000 |
commit | 5a5077dab6d23eccdf6ac957874ea947bc662b53 (patch) | |
tree | 2f1fa5e49b0397758ee6327d8e8034a2c734c9c8 /app-editors/emacs | |
parent | Stable on sparc (diff) | |
download | historical-5a5077dab6d23eccdf6ac957874ea947bc662b53.tar.gz historical-5a5077dab6d23eccdf6ac957874ea947bc662b53.tar.bz2 historical-5a5077dab6d23eccdf6ac957874ea947bc662b53.zip |
retro emacs, lesstif support
Diffstat (limited to 'app-editors/emacs')
-rw-r--r-- | app-editors/emacs/ChangeLog | 13 | ||||
-rw-r--r-- | app-editors/emacs/Manifest | 23 | ||||
-rw-r--r-- | app-editors/emacs/emacs-18.59.ebuild | 68 | ||||
-rw-r--r-- | app-editors/emacs/emacs-21.3-r3.ebuild | 97 | ||||
-rw-r--r-- | app-editors/emacs/files/digest-emacs-18.59 | 2 | ||||
-rw-r--r-- | app-editors/emacs/files/digest-emacs-21.3-r3 | 2 | ||||
-rw-r--r-- | app-editors/emacs/files/emacs-18.59-gcc-gentoo.patch | 175 | ||||
-rw-r--r-- | app-editors/emacs/files/emacs-18.59-gentoo.patch | 96 | ||||
-rw-r--r-- | app-editors/emacs/files/emacs-18.59-unexelf.patch | 878 |
9 files changed, 1345 insertions, 9 deletions
diff --git a/app-editors/emacs/ChangeLog b/app-editors/emacs/ChangeLog index 2ada51ecd993..9af81ea0bab5 100644 --- a/app-editors/emacs/ChangeLog +++ b/app-editors/emacs/ChangeLog @@ -1,6 +1,17 @@ # ChangeLog for app-editors/emacs # Copyright 2002-2004 Gentoo Technologies, Inc.; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/ChangeLog,v 1.24 2004/04/09 06:41:32 iggy Exp $ +# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/ChangeLog,v 1.25 2004/05/13 15:27:43 mkennedy Exp $ + +*emacs-21.3-r3 (13 May 2004) + + 13 May 2004; <mkennedy@gentoo.org> +files/emacs-18.59-gcc-gentoo.patch, + +files/emacs-18.59-gentoo.patch, +files/emacs-18.59-unexelf.patch, + +emacs-18.59.ebuild, +emacs-21.3-r3.ebuild: + Added retro emacs-18.59 w/ SLOT=1 (ebuild contributed by Ulrich Mueller + <ulm@kph.uni-mainz.de>), resolves Bug #44766; Added new emacs-21.3-r3 + with support for using LessTif instead of OpenMotif (OpenMotif has + problems which causes Emacs to be unstable); Marked emacs-21.3-r3 as + ~arch. 09 Apr 2004; Brian Jackson <iggy@gentoo.org> emacs-21.3-r2.ebuild: add s390 keywords diff --git a/app-editors/emacs/Manifest b/app-editors/emacs/Manifest index 874b5a5174c8..943af97088e2 100644 --- a/app-editors/emacs/Manifest +++ b/app-editors/emacs/Manifest @@ -1,14 +1,21 @@ -MD5 41992d567140cedd24b9610aea7752ab emacs-21.1-r4.ebuild 2163 -MD5 f47004be6237b3469d35b2656875fedb emacs-21.3-r2.ebuild 2214 -MD5 5092d9743d9c4aaee8a405f5163f3793 emacs-21.2-r2.ebuild 1852 MD5 0eb1ebef92b3ccf63d7d510c5c4593ca emacs-21.3-r1.ebuild 2138 -MD5 0e802062fd237555b6407fff3d8e61de ChangeLog 3546 +MD5 5092d9743d9c4aaee8a405f5163f3793 emacs-21.2-r2.ebuild 1852 +MD5 f47004be6237b3469d35b2656875fedb emacs-21.3-r2.ebuild 2214 +MD5 7d2bade12651ca2a0abfc86836c4ca29 emacs-21.3-r3.ebuild 2352 +MD5 8490da001361199b4b285dacb264e04e emacs-18.59.ebuild 1997 +MD5 69395dee5b5051f2e0169b377a0fdaf5 ChangeLog 4068 +MD5 41992d567140cedd24b9610aea7752ab emacs-21.1-r4.ebuild 2163 MD5 fcd33d07e4ee719b01157946734f4fe8 metadata.xml 158 +MD5 e8ce9306bc0d26ebc1d4cd6c6c7765d8 files/digest-emacs-21.2-r2 126 MD5 0e5a4a35651f5365c6191636a2c26eb7 files/emacs.desktop 190 +MD5 4163870348c1c0d4dc485dff749fe5cb files/digest-emacs-21.3-r3 126 +MD5 3763ec7eaed9e5bb4da2f3f7c3795594 files/emacs-21.3-hppa.patch 2493 MD5 bb29381a50b72e88d869fb09a2c0a34e files/emacs-21.3-amd64.patch 7938 -MD5 da1e3cd3b08e0f57770ac6bb3a900a37 files/digest-emacs-21.1-r4 64 -MD5 e8ce9306bc0d26ebc1d4cd6c6c7765d8 files/digest-emacs-21.2-r2 126 -MD5 c196c1f14bc7e319f1dadb065f39bbfb files/digest-emacs-21.3-r1 323 MD5 4163870348c1c0d4dc485dff749fe5cb files/digest-emacs-21.3-r2 126 +MD5 c196c1f14bc7e319f1dadb065f39bbfb files/digest-emacs-21.3-r1 323 +MD5 da1e3cd3b08e0f57770ac6bb3a900a37 files/digest-emacs-21.1-r4 64 +MD5 f36e98b1361ca8666d3d4029f121c2bf files/emacs-18.59-gcc-gentoo.patch 5439 +MD5 2179ae07d8caf10bdb4e36126353f0b1 files/emacs-18.59-unexelf.patch 30720 +MD5 2dc071ea24db58587a5e72af42addbc4 files/digest-emacs-18.59 147 MD5 0c27886961e8f16d3889fbd36b4da14d files/emacs-21.1-gentoo.diff 532 -MD5 3763ec7eaed9e5bb4da2f3f7c3795594 files/emacs-21.3-hppa.patch 2493 +MD5 d9a84fa25df38b43cdce07e9ca4f53c0 files/emacs-18.59-gentoo.patch 3901 diff --git a/app-editors/emacs/emacs-18.59.ebuild b/app-editors/emacs/emacs-18.59.ebuild new file mode 100644 index 000000000000..de31af6fcf4d --- /dev/null +++ b/app-editors/emacs/emacs-18.59.ebuild @@ -0,0 +1,68 @@ +# Copyright 1999-2004 Gentoo Technologies, Inc. +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/emacs-18.59.ebuild,v 1.1 2004/05/13 15:27:43 mkennedy Exp $ + +DESCRIPTION="The extensible self-documenting text editor" +SRC_URI="ftp://ftp.gnu.org/old-gnu/emacs/${P}.tar.gz + ftp://ftp.splode.com/pub/users/friedman/patches/${P}-linux22x-elf-glibc2.diff.gz" +HOMEPAGE="http://www.gnu.org/software/emacs/" + +SLOT="1" +KEYWORDS="~x86" +LICENSE="GPL-1" +IUSE="X" +DEPEND="sys-libs/ncurses + X? ( virtual/x11 )" +PROVIDE="virtual/editor" + +MY_BASEDIR="/usr/share/emacs/${PV}" +MY_LOCKDIR="/var/lib/emacs/lock" + +# Do not use the sandbox, or the dumped Emacs will be twice as large +SANDBOX_DISABLED="1" + +src_unpack() { + unpack ${A} + epatch ${P}-linux22x-elf-glibc2.diff + epatch ${FILESDIR}/${P}-unexelf.patch + epatch ${FILESDIR}/${P}-gentoo.patch + epatch ${FILESDIR}/${P}-gcc-gentoo.patch +} + +src_compile() { + # autoconf? What's autoconf? We are living in 1992. ;-) + local arch + case ${ARCH} in + x86) arch=intel386 ;; + *) die "Architecture ${ARCH} not supported" ;; + esac + local cmd="s/\"s-.*\.h\"/\"s-linux.h\"/;s/\"m-.*\.h\"/\"m-${arch}.h\"/" + use X && cmd="${cmd};s/.*\(#define HAVE_X_WINDOWS\).*/\1/" + sed -e "${cmd}" src/config.h-dist >src/config.h + + cat <<-END >src/paths.h + #define PATH_LOADSEARCH "${MY_BASEDIR}/lisp" + #define PATH_EXEC "${MY_BASEDIR}/etc" + #define PATH_LOCK "${MY_LOCKDIR}/" + #define PATH_SUPERLOCK "${MY_LOCKDIR}/!!!SuperLock!!!" + END + + emake -j1 || die +} + +src_install() { + dodir ${MY_BASEDIR} + dodir /usr/share/man/man1 + make install LIBDIR=${D}${MY_BASEDIR} BINDIR=${D}/usr/bin \ + MANDIR=${D}/usr/share/man/man1 || die + chmod -R go-w ${D}${MY_BASEDIR} + rmdir ${D}${MY_BASEDIR}/lock + + dodir ${MY_LOCKDIR%/*} + diropts -m0777 + dodir ${MY_LOCKDIR} + keepdir ${MY_LOCKDIR} + + for file in ${D}/usr/bin/*; do mv ${file} ${file}-${PV}; done + mv ${D}/usr/share/man/man1/emacs.1 ${D}/usr/share/man/man1/emacs-${PV}.1 +} diff --git a/app-editors/emacs/emacs-21.3-r3.ebuild b/app-editors/emacs/emacs-21.3-r3.ebuild new file mode 100644 index 000000000000..20d52305ea9b --- /dev/null +++ b/app-editors/emacs/emacs-21.3-r3.ebuild @@ -0,0 +1,97 @@ +# Copyright 1999-2004 Gentoo Technologies, Inc. +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/emacs-21.3-r3.ebuild,v 1.1 2004/05/13 15:27:43 mkennedy Exp $ + +inherit flag-o-matic eutils + +DESCRIPTION="An incredibly powerful, extensible text editor" +HOMEPAGE="http://www.gnu.org/software/emacs" +SRC_URI="mirror://gnu/emacs/${P}.tar.gz + leim? ( mirror://gnu/emacs/leim-${PV}.tar.gz )" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~x86 ~ppc ~sparc -alpha ~amd64 -hppa -ia64 ~s390" +IUSE="X nls motif leim gnome Xaw3d lesstif" + +RDEPEND="sys-libs/ncurses + sys-libs/gdbm + X? ( virtual/x11 + >=media-libs/libungif-4.1.0.1b + >=media-libs/jpeg-6b-r2 + >=media-libs/tiff-3.5.5-r3 + >=media-libs/libpng-1.2.1 + Xaw3d? ( x11-libs/Xaw3d ) + motif? ( lesstif? ( x11-libs/lesstif ) : ( >=x11-libs/openmotif-2.1.30 ) ) + gnome? ( gnome-base/gnome-desktop ) + ) + nls? ( sys-devel/gettext )" +DEPEND="${RDEPEND} + >=sys-devel/autoconf-2.58" + +PROVIDE="virtual/emacs virtual/editor" +SANDBOX_DISABLED="1" + +DFILE=emacs.desktop + +src_compile() { + + # -fstack-protector gets internal compiler error at xterm.c (bug 33265) + filter-flags -fstack-protector + + epatch ${FILESDIR}/${P}-amd64.patch + epatch ${FILESDIR}/${P}-hppa.patch + + export WANT_AUTOCONF=2.1 + autoconf + + local myconf + use nls || myconf="${myconf} --disable-nls" + if use X ; then + if use motif && use lesstif; then + export LIBS="-L/usr/X11R6/lib/lesstif/" + fi + myconf="${myconf} + --with-x + --with-xpm + --with-jpeg + --with-tiff + --with-gif + --with-png" + if [ "`use motif`" ] ; then + myconf="${myconf} --with-x-toolkit=motif" + elif [ "`use Xaw3d`" ] ; then + myconf="${myconf} --with-x-toolkit=athena" + else + # do not build emacs with any toolkit, bug 35300 + myconf="${myconf} --with-x-toolkit=no" + fi + else + myconf="${myconf} --without-x" + fi + econf ${myconf} || die + emake || die +} + +src_install() { + einstall || die + einfo "Fixing info documentation..." + rm -f ${D}/usr/share/info/dir + for i in ${D}/usr/share/info/* + do + mv ${i%.info} $i.info + done + + einfo "Fixing permissions..." + find ${D} -perm 664 |xargs chmod 644 + find ${D} -type d |xargs chmod 755 + + dodoc BUGS ChangeLog README + + keepdir /usr/share/emacs/${PV}/leim + + if use gnome ; then + insinto /usr/share/gnome/apps/Application + doins ${FILESDIR}/${DFILE} + fi +} diff --git a/app-editors/emacs/files/digest-emacs-18.59 b/app-editors/emacs/files/digest-emacs-18.59 new file mode 100644 index 000000000000..5dc7708b786e --- /dev/null +++ b/app-editors/emacs/files/digest-emacs-18.59 @@ -0,0 +1,2 @@ +MD5 ca57ae095ef098faca135bca736e1ca8 emacs-18.59.tar.gz 2962652 +MD5 a7a4ed051dc232cdc9cf37208135302a emacs-18.59-linux22x-elf-glibc2.diff.gz 15671 diff --git a/app-editors/emacs/files/digest-emacs-21.3-r3 b/app-editors/emacs/files/digest-emacs-21.3-r3 new file mode 100644 index 000000000000..7aafc8e2fda1 --- /dev/null +++ b/app-editors/emacs/files/digest-emacs-21.3-r3 @@ -0,0 +1,2 @@ +MD5 a0bab457cbf5b4f8eb99d1d0a3ada420 emacs-21.3.tar.gz 20399831 +MD5 1c968c37e22be0f0d8f8cd57cebe5a5e leim-21.3.tar.gz 3291224 diff --git a/app-editors/emacs/files/emacs-18.59-gcc-gentoo.patch b/app-editors/emacs/files/emacs-18.59-gcc-gentoo.patch new file mode 100644 index 000000000000..ac825f7896c0 --- /dev/null +++ b/app-editors/emacs/files/emacs-18.59-gcc-gentoo.patch @@ -0,0 +1,175 @@ +Only in emacs-18.59/etc: DOC +Only in emacs-18.59/etc: DOC-18.59.1 +Files emacs-18.59.orig/etc/ctags and emacs-18.59/etc/ctags differ +Only in emacs-18.59/etc: cvtmail +Files emacs-18.59.orig/etc/digest-doc and emacs-18.59/etc/digest-doc differ +Only in emacs-18.59/etc: emacsclient +Only in emacs-18.59/etc: env +diff -ur emacs-18.59.orig/etc/etags.c emacs-18.59/etc/etags.c +--- emacs-18.59.orig/etc/etags.c 2004-05-12 19:51:20.263954648 -0500 ++++ emacs-18.59/etc/etags.c 2004-05-12 19:54:07.018604088 -0500 +@@ -128,8 +128,6 @@ + + char *savestr(); + char *savenstr (); +-char *rindex(); +-char *index(); + char *concat (); + void initbuffer (); + long readline (); +@@ -1380,7 +1378,6 @@ + char *defenv; + { + register char *env, *p; +- extern char *savenstr (), *index (); + + struct TEX_tabent *tab; + int size, i; +@@ -1530,47 +1527,6 @@ + return dp; + } + +-/* +- * Return the ptr in sp at which the character c last +- * appears; NULL if not found +- * +- * Identical to v7 rindex, included for portability. +- */ +- +-char * +-rindex(sp, c) +- register char *sp, c; +-{ +- register char *r; +- +- r = NULL; +- do +- { +- if (*sp == c) +- r = sp; +- } while (*sp++); +- return(r); +-} +- +-/* +- * Return the ptr in sp at which the character c first +- * appears; NULL if not found +- * +- * Identical to v7 index, included for portability. +- */ +- +-char * +-index(sp, c) +- register char *sp, c; +-{ +- do +- { +- if (*sp == c) +- return (sp); +- } while (*sp++); +- return (NULL); +-} +- + /* Print error message and exit. */ + + fatal (s1, s2) +Only in emacs-18.59/etc: fakemail +Files emacs-18.59.orig/etc/make-docfile and emacs-18.59/etc/make-docfile differ +Only in emacs-18.59/etc: movemail +Only in emacs-18.59/etc: server +Files emacs-18.59.orig/etc/sorted-doc and emacs-18.59/etc/sorted-doc differ +Files emacs-18.59.orig/etc/wakeup and emacs-18.59/etc/wakeup differ +Only in emacs-18.59/etc: yow +diff -ur emacs-18.59.orig/lisp/version.el emacs-18.59/lisp/version.el +--- emacs-18.59.orig/lisp/version.el 2004-05-12 19:51:09.078655072 -0500 ++++ emacs-18.59/lisp/version.el 2004-05-12 19:57:25.812382840 -0500 +@@ -20,7 +20,7 @@ + + ;; The following line is modified automatically + ;; by loading inc-version.el, each time a new Emacs is dumped. +-(defconst emacs-version "18.59.0" "\ ++(defconst emacs-version "18.59.1" "\ + Version numbers of this version of Emacs.") + + (defconst emacs-build-time (current-time-string) "\ +Only in emacs-18.59/src: abbrev.o +Only in emacs-18.59/src: alloc.o +Only in emacs-18.59/src: buffer.o +Only in emacs-18.59/src: bytecode.o +Only in emacs-18.59/src: callint.o +Only in emacs-18.59/src: callproc.o +Only in emacs-18.59/src: casefiddle.o +Only in emacs-18.59/src: cm.o +Only in emacs-18.59/src: cmds.o +Only in emacs-18.59/src: config.h +Only in emacs-18.59/src: data.o +Only in emacs-18.59/src: dired.o +Only in emacs-18.59/src: dispnew.o +Only in emacs-18.59/src: doc.o +Only in emacs-18.59/src: doprnt.o +Only in emacs-18.59/src: editfns.o +Only in emacs-18.59/src: emacs-18.59.1 +Only in emacs-18.59/src: emacs.o +Only in emacs-18.59/src: eval.o +Only in emacs-18.59/src: fileio.o +Only in emacs-18.59/src: filelock.o +Only in emacs-18.59/src: filemode.o +Only in emacs-18.59/src: fns.o +Only in emacs-18.59/src: indent.o +Only in emacs-18.59/src: insdel.o +Only in emacs-18.59/src: keyboard.o +Only in emacs-18.59/src: keymap.o +Only in emacs-18.59/src: lastfile.o +diff -ur emacs-18.59.orig/src/lisp.h emacs-18.59/src/lisp.h +--- emacs-18.59.orig/src/lisp.h 2004-05-12 19:51:10.200484528 -0500 ++++ emacs-18.59/src/lisp.h 2004-05-12 19:56:52.999371176 -0500 +@@ -983,7 +983,7 @@ + + extern void debugger (); + +-extern char *malloc (), *realloc (), *getenv (), *ctime (), *getwd (); ++/* extern void *malloc (), *realloc (),*getenv (), *ctime (), *getwd (); */ + extern long *xmalloc (), *xrealloc (); + + #ifdef MAINTAIN_ENVIRONMENT +Only in emacs-18.59/src: lisp.h~ +Only in emacs-18.59/src: lread.o +Only in emacs-18.59/src: macros.o +Only in emacs-18.59/src: malloc.o +Only in emacs-18.59/src: marker.o +Only in emacs-18.59/src: minibuf.o +Only in emacs-18.59/src: mocklisp.o +Only in emacs-18.59/src: paths.h +Only in emacs-18.59/src: pre-crt0.o +Only in emacs-18.59/src: print.o +Only in emacs-18.59/src: process.o +Only in emacs-18.59/src: regex.o +diff -ur emacs-18.59.orig/src/s-linux.h emacs-18.59/src/s-linux.h +--- emacs-18.59.orig/src/s-linux.h 2004-05-12 19:51:09.959521160 -0500 ++++ emacs-18.59/src/s-linux.h 2004-05-12 20:03:12.614660880 -0500 +@@ -253,7 +253,7 @@ + + #define C_COMPILER gcc + #define C_DEBUG_SWITCH -g +-#define C_OPTIMIZE_SWITCH -O2 -malign-loops=2 -malign-jumps=2 -malign-functions=2 ++#define C_OPTIMIZE_SWITCH -O2 -falign-loops=2 -falign-jumps=2 -falign-functions=2 + #define OLDXMENU_OPTIONS CFLAGS=-O2 EXTRA=insque.o + #define START_FILES pre-crt0.o /usr/lib/crt1.o /usr/lib/crti.o + #define LIBS_DEBUG /* override in config.h to include -lg */ +Only in emacs-18.59/src: s-linux.h~ +Only in emacs-18.59/src: scroll.o +Only in emacs-18.59/src: search.o +Only in emacs-18.59/src: syntax.o +Only in emacs-18.59/src: sysdep.o +Only in emacs-18.59/src: temacs +Only in emacs-18.59/src: term.o +Only in emacs-18.59/src: terminfo.o +Only in emacs-18.59/src: undo.o +Only in emacs-18.59/src: unexelf.o +Only in emacs-18.59/src: window.o +Only in emacs-18.59/src: x11fns.o +Only in emacs-18.59/src: x11term.o +Only in emacs-18.59/src: xdisp.o +Only in emacs-18.59/src: xemacs +Only in emacs-18.59/src: xmakefile +Only in emacs-18.59/src: xmakefile~ diff --git a/app-editors/emacs/files/emacs-18.59-gentoo.patch b/app-editors/emacs/files/emacs-18.59-gentoo.patch new file mode 100644 index 000000000000..0b6d94acd981 --- /dev/null +++ b/app-editors/emacs/files/emacs-18.59-gentoo.patch @@ -0,0 +1,96 @@ +Prereq: 2004-03-08 +diff -Nur emacs-18.59-orig/src/ChangeLog emacs-18.59/src/ChangeLog +--- emacs-18.59-orig/src/ChangeLog 2004-03-08 09:38:50.000000000 +0100 ++++ emacs-18.59/src/ChangeLog 2004-03-09 08:36:49.000000000 +0100 +@@ -1,3 +1,9 @@ ++2004-03-09 Ulrich Mueller <ulm@kph.uni-mainz.de> ++ ++ * malloc.c (DONT_DEFINE_SIGNAL): Defined. ++ ++ * s-linux.h (TERMINFO): Moved here from ymakefile. ++ + 2004-03-08 Ulrich Mueller <ulm@kph.uni-mainz.de> + + * unexelf.c: Replaced with version from Emacs 21.3. +diff -Nur emacs-18.59-orig/src/malloc.c emacs-18.59/src/malloc.c +--- emacs-18.59-orig/src/malloc.c 1992-03-23 05:09:07.000000000 +0100 ++++ emacs-18.59/src/malloc.c 2004-03-09 08:33:12.000000000 +0100 +@@ -59,6 +59,9 @@ + */ + + #ifdef emacs ++/* Inhibit macro definition of "signal" in m-*.h */ ++#define DONT_DEFINE_SIGNAL ++ + /* config.h specifies which kind of system this is. */ + #include "config.h" + +diff -Nur emacs-18.59-orig/src/s-linux.h emacs-18.59/src/s-linux.h +--- emacs-18.59-orig/src/s-linux.h 1999-11-05 09:17:23.000000000 +0100 ++++ emacs-18.59/src/s-linux.h 2004-03-09 08:34:05.000000000 +0100 +@@ -164,6 +164,9 @@ + #define POSIX /* affects only getpagesize.h */ + #define POSIX_SIGNALS /* uses sigaction from sys_signal */ + ++/* Use terminfo instead of termcap. */ ++#define TERMINFO ++ + #ifdef HAVE_PTMX + + /* This change means that we don't loop through allocate_pty too many +@@ -250,7 +253,7 @@ + + #define C_COMPILER gcc + #define C_DEBUG_SWITCH -g +-#define C_OPTIMIZE_SWITCH -O3 -malign-loops=2 -malign-jumps=2 -malign-functions=2 ++#define C_OPTIMIZE_SWITCH -O2 -malign-loops=2 -malign-jumps=2 -malign-functions=2 + #define OLDXMENU_OPTIONS CFLAGS=-O2 EXTRA=insque.o + #define START_FILES pre-crt0.o /usr/lib/crt1.o /usr/lib/crti.o + #define LIBS_DEBUG /* override in config.h to include -lg */ +diff -Nur emacs-18.59-orig/src/ymakefile emacs-18.59/src/ymakefile +--- emacs-18.59-orig/src/ymakefile 1999-11-05 09:19:47.000000000 +0100 ++++ emacs-18.59/src/ymakefile 2003-11-13 08:35:38.000000000 +0100 +@@ -191,7 +191,7 @@ + SHORT= shortnames + #endif /* SHORTNAMES */ + +-CFLAGS= C_DEBUG_SWITCH C_OPTIMIZE_SWITCH -Demacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM ++CFLAGS= C_OPTIMIZE_SWITCH -Demacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM + /* DO NOT use -R. There is a special hack described in lastfile.c + which is used instead. Some initialized data areas are modified + at initial startup, then labeled as part of the text area when +@@ -284,7 +284,6 @@ + process.o callproc.o $(environobj) \ + doprnt.o + +-#define TERMINFO + #ifdef TERMINFO + /* Used to be -ltermcap here. If your machine needs that, + define LIBS_TERMCAP in the m- file. */ +diff -Nur emacs-18.59-orig/lisp/ChangeLog emacs-18.59/lisp/ChangeLog +--- emacs-18.59-orig/lisp/ChangeLog 1992-10-31 01:32:00.000000000 +0100 ++++ emacs-18.59/lisp/ChangeLog 2004-03-08 09:37:21.000000000 +0100 +@@ -1,3 +1,9 @@ ++2004-03-08 Ulrich Mueller <ulm@kph.uni-mainz.de> ++ ++ * term/linux.el: New file. ++ ++ * term/xterm.el: Load vt200.el. ++ + Fri Oct 30 19:36:38 1992 Richard Stallman (rms@mole.gnu.ai.mit.edu) + + * Version 18.59 released. +diff -Nur emacs-18.59-orig/lisp/term/linux.el emacs-18.59/lisp/term/linux.el +--- emacs-18.59-orig/lisp/term/linux.el 1970-01-01 01:00:00.000000000 +0100 ++++ emacs-18.59/lisp/term/linux.el 2003-11-29 21:37:15.000000000 +0100 +@@ -0,0 +1,2 @@ ++(load (concat term-file-prefix "vt200") nil t) ++(enable-arrow-keys) +diff -Nur emacs-18.59-orig/lisp/term/xterm.el emacs-18.59/lisp/term/xterm.el +--- emacs-18.59-orig/lisp/term/xterm.el 1989-04-27 03:52:39.000000000 +0200 ++++ emacs-18.59/lisp/term/xterm.el 2003-11-29 21:37:15.000000000 +0100 +@@ -1,2 +1,2 @@ +-;; Don't send the `ti' string when screen is cleared. +-(setq reset-terminal-on-clear nil) ++(load (concat term-file-prefix "vt200") nil t) ++(enable-arrow-keys) diff --git a/app-editors/emacs/files/emacs-18.59-unexelf.patch b/app-editors/emacs/files/emacs-18.59-unexelf.patch new file mode 100644 index 000000000000..66aa78a7f01b --- /dev/null +++ b/app-editors/emacs/files/emacs-18.59-unexelf.patch @@ -0,0 +1,878 @@ +Prereq: 1999-11-05 +diff -Nur emacs-18.59-orig/src/ChangeLog emacs-18.59/src/ChangeLog +--- emacs-18.59-orig/src/ChangeLog 1999-11-05 09:19:56.000000000 +0100 ++++ emacs-18.59/src/ChangeLog 2004-03-08 09:38:50.000000000 +0100 +@@ -1,3 +1,7 @@ ++2004-03-08 Ulrich Mueller <ulm@kph.uni-mainz.de> ++ ++ * unexelf.c: Replaced with version from Emacs 21.3. ++ + 1999-11-05 Noah Friedman <friedman@splode.com> + + * ymakefile [LIBS_TERMCAP]: Use -lncurses, not -lcurses. +diff -Nur emacs-18.59-orig/src/unexelf.c emacs-18.59/src/unexelf.c +--- emacs-18.59-orig/src/unexelf.c 1998-05-31 04:35:54.000000000 +0200 ++++ emacs-18.59/src/unexelf.c 2004-03-08 01:18:54.000000000 +0100 +@@ -1,4 +1,4 @@ +-/* 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 file is part of GNU Emacs. +@@ -33,14 +33,14 @@ + * Modified heavily since then. + * + * Synopsis: +- * unexec (new_name, a_name, data_start, bss_start, entry_address) +- * char *new_name, *a_name; ++ * unexec (new_name, old_name, data_start, bss_start, entry_address) ++ * char *new_name, *old_name; + * unsigned data_start, bss_start, entry_address; + * + * Takes a snapshot of the program and makes an a.out format file in the + * file named by the string argument new_name. +- * If a_name is non-NULL, the symbol table will be taken from the given file. +- * On some machines, an existing a_name file is required. ++ * If old_name is non-NULL, the symbol table will be taken from the given file. ++ * On some machines, an existing old_name file is required. + * + * 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. +@@ -52,11 +52,6 @@ + * 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 +@@ -66,9 +61,6 @@ + * + * 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 +- * + */ + + /* Even more heavily modified by james@bigtex.cactus.org of Dell Computer Co. +@@ -412,22 +404,159 @@ + + */ + ++/* ++ * 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" ++extern void fatal (char *, ...); ++#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> ++#if !defined (__NetBSD__) && !defined (__OpenBSD__) + #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 +-#include "config.h" +-extern void fatal (char *, ...); ++#define MAP_ANON 0 ++#endif ++#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 ++ /usr/include/sym.h, but this file is no longer included in Red Hat ++ 5.0 and presumably in any other glibc 2.x based distribution. */ ++typedef struct { ++ short magic; ++ short vstamp; ++ int ilineMax; ++ int idnMax; ++ int ipdMax; ++ int isymMax; ++ int ioptMax; ++ int iauxMax; ++ int issMax; ++ int issExtMax; ++ int ifdMax; ++ int crfd; ++ int iextMax; ++ long cbLine; ++ long cbLineOffset; ++ long cbDnOffset; ++ long cbPdOffset; ++ long cbSymOffset; ++ long cbOptOffset; ++ long cbAuxOffset; ++ long cbSsOffset; ++ long cbSsExtOffset; ++ long cbFdOffset; ++ long cbRfdOffset; ++ long cbExtOffset; ++} HDRR, *pHDRR; ++#define cbHDRR sizeof(HDRR) ++#define hdrNil ((pHDRR)0) ++#endif ++ ++#ifdef __NetBSD__ ++/* ++ * NetBSD does not have normal-looking user-land ELF support. ++ */ ++# if defined __alpha__ || defined __sparc_v9__ ++# define ELFSIZE 64 ++# else ++# define ELFSIZE 32 ++# endif ++# include <sys/exec_elf.h> ++ ++# 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 */ ++ ++# ifdef __alpha__ ++# include <sys/exec_ecoff.h> ++# define HDRR struct ecoff_symhdr ++# define pHDRR HDRR * ++# endif /* __alpha__ */ ++ ++#ifdef __mips__ /* was in pkgsrc patches for 20.7 */ ++# define SHT_MIPS_DEBUG DT_MIPS_FLAGS ++# define HDRR struct Elf_Shdr ++#endif /* __mips__ */ ++#endif /* __NetBSD__ */ ++ ++#ifdef __OpenBSD__ ++# include <sys/exec_elf.h> ++#endif ++ ++#if __GNU_LIBRARY__ - 0 >= 6 ++# include <link.h> /* get ElfW etc */ ++#endif ++ ++#ifndef ElfW ++# ifdef __STDC__ ++# define ElfBitsW(bits, type) Elf##bits##_##type ++# else ++# define ElfBitsW(bits, type) Elf/**/bits/**/_/**/type ++# endif ++# ifdef _LP64 ++# define ELFSIZE 64 ++# else ++# define ELFSIZE 32 ++# endif ++ /* This macro expands `bits' before invoking ElfBitsW. */ ++# define ElfExpandBitsW(bits, type) ElfBitsW (bits, type) ++# define ElfW(type) ElfExpandBitsW (ELFSIZE, type) + #endif + + #ifndef ELF_BSS_SECTION_NAME +@@ -462,13 +591,13 @@ + */ + + #define OLD_SECTION_H(n) \ +- (*(Elf32_Shdr *) ((byte *) old_section_h + old_file_h->e_shentsize * (n))) ++ (*(ElfW(Shdr) *) ((byte *) old_section_h + old_file_h->e_shentsize * (n))) + #define NEW_SECTION_H(n) \ +- (*(Elf32_Shdr *) ((byte *) new_section_h + new_file_h->e_shentsize * (n))) ++ (*(ElfW(Shdr) *) ((byte *) new_section_h + new_file_h->e_shentsize * (n))) + #define OLD_PROGRAM_H(n) \ +- (*(Elf32_Phdr *) ((byte *) old_program_h + old_file_h->e_phentsize * (n))) ++ (*(ElfW(Phdr) *) ((byte *) old_program_h + old_file_h->e_phentsize * (n))) + #define NEW_PROGRAM_H(n) \ +- (*(Elf32_Phdr *) ((byte *) new_program_h + new_file_h->e_phentsize * (n))) ++ (*(ElfW(Phdr) *) ((byte *) new_program_h + new_file_h->e_phentsize * (n))) + + #define PATCH_INDEX(n) \ + do { \ +@@ -478,9 +607,9 @@ + + /* Round X up to a multiple of Y. */ + +-int ++static ElfW(Addr) + round_up (x, y) +- int x, y; ++ ElfW(Addr) x, y; + { + int rem = x % y; + if (rem == 0) +@@ -488,6 +617,45 @@ + return x - rem + y; + } + ++/* Return the index of the section named NAME. ++ SECTION_NAMES, FILE_NAME and FILE_H give information ++ about the file we are looking in. ++ ++ If we don't find the section NAME, that is a fatal error ++ if NOERROR is 0; we return -1 if NOERROR is nonzero. */ ++ ++static int ++find_section (name, section_names, file_name, old_file_h, old_section_h, noerror) ++ char *name; ++ char *section_names; ++ char *file_name; ++ ElfW(Ehdr) *old_file_h; ++ ElfW(Shdr) *old_section_h; ++ int noerror; ++{ ++ 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 + * +@@ -507,25 +675,36 @@ + /* 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. + */ +- Elf32_Ehdr *old_file_h, *new_file_h; +- Elf32_Phdr *old_program_h, *new_program_h; +- Elf32_Shdr *old_section_h, *new_section_h; ++ ElfW(Ehdr) *old_file_h, *new_file_h; ++ ElfW(Phdr) *old_program_h, *new_program_h; ++ ElfW(Shdr) *old_section_h, *new_section_h; + + /* Point to the section name table in the old file */ + char *old_section_names; + +- Elf32_Addr old_bss_addr, new_bss_addr; +- 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; ++ 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); + +@@ -535,52 +714,80 @@ + 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); ++#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); ++ /* 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 */ + +- old_file_h = (Elf32_Ehdr *) old_base; +- old_program_h = (Elf32_Phdr *) ((byte *) old_base + old_file_h->e_phoff); +- old_section_h = (Elf32_Shdr *) ((byte *) old_base + old_file_h->e_shoff); ++ old_file_h = (ElfW(Ehdr) *) old_base; ++ old_program_h = (ElfW(Phdr) *) ((byte *) old_base + old_file_h->e_phoff); ++ old_section_h = (ElfW(Shdr) *) ((byte *) old_base + old_file_h->e_shoff); + old_section_names = (char *) old_base + + OLD_SECTION_H (old_file_h->e_shstrndx).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; ++ 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_index = old_sbss_index; + } +- 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); ++ /* 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 + new_bss_addr = old_bss_addr + old_bss_size + 0x1234; + #endif + new_data2_addr = old_bss_addr; + new_data2_size = new_bss_addr - old_bss_addr; +- 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); + + #ifdef DEBUG + fprintf (stderr, "old_bss_index %d\n", old_bss_index); +@@ -595,9 +802,9 @@ + 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); +@@ -609,20 +816,14 @@ + if (ftruncate (new_file, new_file_size)) + fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno); + +-#ifdef UNEXEC_USE_MAP_PRIVATE +- new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, +- new_file, 0); +-#else +- new_base = mmap (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); +- +- 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 *) ++ 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); + + /* Make our new file, program and section headers as copies of the +@@ -661,12 +862,22 @@ + 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; + +- 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 ++ > (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 +@@ -678,7 +889,9 @@ + 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; ++ /* 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? */ +@@ -712,12 +925,14 @@ + for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++) + { + caddr_t src; +- /* If it is bss section, insert the new data2 section before it. */ +- if (n == old_bss_index) ++ /* 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. */ ++ 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), +- new_file_h->e_shentsize); ++ new_file_h->e_shentsize); + + NEW_SECTION_H (nn).sh_addr = new_data2_addr; + NEW_SECTION_H (nn).sh_offset = new_data2_offset; +@@ -737,13 +952,17 @@ + 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 ++ /* 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 ++ ) + { +- /* 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_SECTION_H (new_data2_index).sh_offset + new_data2_size; ++ NEW_SECTION_H (nn).sh_addr = ++ NEW_SECTION_H (new_data2_index).sh_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 + this section will be placed in exactly the same place. */ +@@ -767,7 +986,9 @@ + >= OLD_SECTION_H (old_bss_index-1).sh_offset) + NEW_SECTION_H (nn).sh_offset += new_data2_size; + #else +- if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset) ++ 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; + #endif + /* Any section that was originally placed after the section +@@ -787,18 +1008,54 @@ + 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; + +- /* Write out the sections. .data and .data1 (and data2, called ++ /* 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. */ + if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data") + || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), +- ".data1")) ++ ".sdata") ++ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), ++ ".lit4") ++ || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name), ++ ".lit8") ++ /* 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), ++ ".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; +@@ -806,13 +1063,114 @@ + memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src, + NEW_SECTION_H (nn).sh_size); + ++#ifdef __alpha__ ++ /* 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); ++ ++ 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 != -1) ++ { ++ int diff = NEW_SECTION_H(nn).sh_offset ++ - OLD_SECTION_H(old_mdebug_index).sh_offset; ++ HDRR *phdr = (HDRR *)(NEW_SECTION_H (nn).sh_offset + new_base); ++ ++ if (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 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 + || NEW_SECTION_H (nn).sh_type == SHT_DYNSYM) + { +- Elf32_Shdr *spt = &NEW_SECTION_H (nn); ++ ElfW(Shdr) *spt = &NEW_SECTION_H (nn); + unsigned int num = spt->sh_size / spt->sh_entsize; +- Elf32_Sym * sym = (Elf32_Sym *) (NEW_SECTION_H (nn).sh_offset + ++ ElfW(Sym) * sym = (ElfW(Sym) *) (NEW_SECTION_H (nn).sh_offset + + new_base); + for (; num--; sym++) + { +@@ -830,7 +1188,7 @@ + for (n = new_file_h->e_shnum - 1; n; n--) + { + byte *symnames; +- Elf32_Sym *symp, *symendp; ++ ElfW(Sym) *symp, *symendp; + + if (NEW_SECTION_H (n).sh_type != SHT_DYNSYM + && NEW_SECTION_H (n).sh_type != SHT_SYMTAB) +@@ -838,12 +1196,14 @@ + + symnames = ((byte *) new_base + + NEW_SECTION_H (NEW_SECTION_H (n).sh_link).sh_offset); +- symp = (Elf32_Sym *) (NEW_SECTION_H (n).sh_offset + new_base); +- symendp = (Elf32_Sym *) ((byte *)symp + NEW_SECTION_H (n).sh_size); ++ symp = (ElfW(Sym) *) (NEW_SECTION_H (n).sh_offset + new_base); ++ symendp = (ElfW(Sym) *) ((byte *)symp + NEW_SECTION_H (n).sh_size); + + for (; symp < symendp; symp ++) + if (strcmp ((char *) (symnames + symp->st_name), "_end") == 0 +- || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0) ++ || strcmp ((char *) (symnames + symp->st_name), "end") == 0 ++ || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0 ++ || strcmp ((char *) (symnames + symp->st_name), "edata") == 0) + memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr)); + } + +@@ -851,7 +1211,7 @@ + that it can undo relocations performed by the runtime linker. */ + for (n = new_file_h->e_shnum - 1; n; n--) + { +- Elf32_Shdr section = NEW_SECTION_H (n); ++ ElfW(Shdr) section = NEW_SECTION_H (n); + switch (section.sh_type) { + default: + break; +@@ -863,37 +1223,65 @@ + 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")) + { +- Elf32_Addr offset = NEW_SECTION_H (nn).sh_addr - ++ ElfW(Addr) offset = NEW_SECTION_H (nn).sh_addr - + NEW_SECTION_H (nn).sh_offset; + caddr_t reloc = old_base + section.sh_offset, end; + for (end = reloc + section.sh_size; reloc < end; + reloc += section.sh_entsize) + { +- Elf32_Addr addr = ((Elf32_Rel *) reloc)->r_offset - offset; +- memcpy (new_base + addr, old_base + addr, 4); +- } ++ ElfW(Addr) addr = ((ElfW(Rel) *) reloc)->r_offset - offset; ++#ifdef __alpha__ ++ /* The Alpha ELF binutils currently have a bug that ++ sometimes results in relocs that contain all ++ zeroes. Work around this for now... */ ++ if (((ElfW(Rel) *) reloc)->r_offset == 0) ++ continue; ++#endif ++ memcpy (new_base + addr, old_base + addr, sizeof(ElfW(Addr))); ++ } + } + 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); ++ /* 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); +-#endif ++ 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 the files and make the new file executable. */ ++ /* Close old_file, and free the corresponding buffer */ ++ ++#if MAP_ANON == 0 ++ close (mmap_fd); ++#endif + + if (close (old_file)) + fatal ("Can't close (%s): errno %d\n", old_name, errno); + +- if (close (new_file)) +- fatal ("Can't close (%s): errno %d\n", new_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); |