diff options
| author | leo <leo@NetBSD.org> | 1995-03-26 07:12:03 +0000 |
|---|---|---|
| committer | leo <leo@NetBSD.org> | 1995-03-26 07:12:03 +0000 |
| commit | 8b0113cfceadf3ee3bc427c4680b6b46bb57ceea (patch) | |
| tree | 2a5b7db0400149a733175c4b1a56774b2d4c1eb7 /sys/arch/atari/stand/binpatch | |
| parent | 282052c7a8346370f47965457329f3b0b3fa01b7 (diff) | |
NetBSD/Atari, port by Leo Weppelman.
Diffstat (limited to 'sys/arch/atari/stand/binpatch')
| -rw-r--r-- | sys/arch/atari/stand/binpatch/Makefile | 9 | ||||
| -rw-r--r-- | sys/arch/atari/stand/binpatch/binpatch.8 | 96 | ||||
| -rw-r--r-- | sys/arch/atari/stand/binpatch/binpatch.c | 241 |
3 files changed, 346 insertions, 0 deletions
diff --git a/sys/arch/atari/stand/binpatch/Makefile b/sys/arch/atari/stand/binpatch/Makefile new file mode 100644 index 00000000000..868b6a0fd7c --- /dev/null +++ b/sys/arch/atari/stand/binpatch/Makefile @@ -0,0 +1,9 @@ +# $NetBSD: Makefile,v 1.1.1.1 1995/03/26 07:12:05 leo Exp $ + +PROG=binpatch +MAN8=binpatch.0 + +BINDIR=/sbin +LDFLAGS+=-static + +.include <bsd.prog.mk> diff --git a/sys/arch/atari/stand/binpatch/binpatch.8 b/sys/arch/atari/stand/binpatch/binpatch.8 new file mode 100644 index 00000000000..4d0017b3eb4 --- /dev/null +++ b/sys/arch/atari/stand/binpatch/binpatch.8 @@ -0,0 +1,96 @@ +.\" $NetBSD: binpatch.8,v 1.1.1.1 1995/03/26 07:12:05 leo Exp $ +.\" +.\" Copyright (c) 1994 Christian E. Hopps +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by Christian E. Hopps. +.\" 3. The name of the author may not be used to endorse or promote products +.\" derived from this software without specific prior written permission +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +.\" +.Dd February 2, 1994 +.Dt BINPATCH 8 atari +.Os +.Sh NAME +.Nm binpatch +.Nd examine and or modify initialized data in a binary file. +.Sh SYNOPSIS +.Nm binpatch +.Op Fl b | Fl w | Fl l +.Op Fl o Ar offset +.Fl s Ar symname +.Op Fl r Ar value +.Ar binfile +.Nm binpatch +.Op Fl b | Fl w | Fl l +.Op Fl o Ar offset +.Fl a Ar addr +.Op Fl r Ar value +.Ar binfile +.Sh DESCRIPTION +.Nm binpatch +is used to modify or examine the data associated with a symbol in a binary +file +.Ar binfile . +The flags +.Fl b , +.Fl w +and +.Fl l +specify the size of the data to be modified or examined +(byte, word and long respectively.) The +.Ar binfile +is scanned in search of the symbol +.Ar symname +(specified with the +.Fl s +flag) +If the symbol is found the current data and address are printed. Next if the +.Fl r +flag has been given, the current data is replaced with that of +.Ar value . +.Pp +If the second form is used the address +.Ar addr +specified with the +.Fl a +flag is used as a direct address into the data section of the binary and +no symbol search is performed. +.Pp +The +.Fl o +flag specifies an offset in byte, word or long ( +.Fl b +, +.Fl w +, +or +.Fl l +) units from the given locator ( +.Fl s +or +.Fl a +) for +.Nm binpatch +to perform it's described actions. + diff --git a/sys/arch/atari/stand/binpatch/binpatch.c b/sys/arch/atari/stand/binpatch/binpatch.c new file mode 100644 index 00000000000..79f25f72c0a --- /dev/null +++ b/sys/arch/atari/stand/binpatch/binpatch.c @@ -0,0 +1,241 @@ +/* $NetBSD: binpatch.c,v 1.1.1.1 1995/03/26 07:12:04 leo Exp $ */ + +/* + * Copyright (c) 1994 Christian E. Hopps + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Christian E. Hopps. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <a.out.h> +#include <stdio.h> + +extern char *optarg; +extern int optind; + +volatile void error (); + +int test = 1; +int testbss; +char foo = 23; + + +int +main(argc, argv) + int argc; + char *argv[]; +{ + struct exec e; + int c; + u_long addr = 0, offset = 0; + u_long replace = 0, do_replace = 0; + char *symbol = 0; + char size = 4; /* default to long */ + char *fname; + int fd; + int type, off; + u_long lval; + u_short sval; + u_char cval; + + + while ((c = getopt (argc, argv, "a:bwlr:s:o:")) != EOF) + switch (c) + { + case 'a': + if (addr || symbol) + error ("only one address/symbol allowed"); + if (! strncmp (optarg, "0x", 2)) + sscanf (optarg, "%x", &addr); + else + addr = atoi (optarg); + if (! addr) + error ("invalid address"); + break; + + case 'b': + size = 1; + break; + + case 'w': + size = 2; + break; + + case 'l': + size = 4; + break; + + case 'r': + do_replace = 1; + if (! strncmp (optarg, "0x", 2)) + sscanf (optarg, "%x", &replace); + else + replace = atoi (optarg); + break; + + case 's': + if (addr || symbol) + error ("only one address/symbol allowed"); + symbol = optarg; + break; + + case 'o': + if (offset) + error ("only one offset allowed"); + if (! strncmp (optarg, "0x", 2)) + sscanf (optarg, "%x", &offset); + else + offset = atoi (optarg); + break; + } + + argv += optind; + argc -= optind; + + + if (argc < 1) + error ("No file to patch."); + + fname = argv[0]; + if ((fd = open (fname, 0)) < 0) + error ("Can't open file"); + + if (read (fd, &e, sizeof (e)) != sizeof (e) + || N_BADMAG (e)) + error ("Not a valid executable."); + + /* fake mid, so the N_ macros work on the amiga.. */ + e.a_midmag |= 127 << 16; + + if (symbol) + { + struct nlist nl[2]; + nl[0].n_un.n_name = symbol; + nl[1].n_un.n_name = 0; + if (nlist (fname, nl) != 0) + error ("Symbol not found."); + addr = nl[0].n_value; + type = nl[0].n_type & N_TYPE; + } + else + { + type = N_UNDF; + if (addr >= N_TXTADDR(e) && addr < N_DATADDR(e)) + type = N_TEXT; + else if (addr >= N_DATADDR(e) && addr < N_DATADDR(e) + e.a_data) + type = N_DATA; + } + addr += offset; + + /* if replace-mode, have to reopen the file for writing. + Can't do that from the beginning, or nlist() will not + work (at least not under AmigaDOS) */ + if (do_replace) + { + close (fd); + if ((fd = open (fname, 2)) == -1) + error ("Can't reopen file for writing."); + } + + if (type != N_TEXT && type != N_DATA) + error ("address/symbol is not in text or data section."); + + if (type == N_TEXT) + off = addr - N_TXTADDR(e) + N_TXTOFF(e); + else + off = addr - N_DATADDR(e) + N_DATOFF(e); + + if (lseek (fd, off, 0) == -1) + error ("lseek"); + + /* not beautiful, but works on big and little endian machines */ + switch (size) + { + case 1: + if (read (fd, &cval, 1) != 1) + error ("cread"); + lval = cval; + break; + + case 2: + if (read (fd, &sval, 2) != 2) + error ("sread"); + lval = sval; + break; + + case 4: + if (read (fd, &lval, 4) != 4) + error ("lread"); + break; + } + + + if (symbol) + printf ("%s(0x%x): %d (0x%x)\n", symbol, addr, lval, lval); + else + printf ("0x%x: %d (0x%x)\n", addr, lval, lval); + + if (do_replace) + { + if (lseek (fd, off, 0) == -1) + error ("write-lseek"); + switch (size) + { + case 1: + cval = replace; + if (cval != replace) + error ("byte-value overflow."); + if (write (fd, &cval, 1) != 1) + error ("cwrite"); + break; + + case 2: + sval = replace; + if (sval != replace) + error ("word-value overflow."); + if (write (fd, &sval, 2) != 2) + error ("swrite"); + break; + + case 4: + if (write (fd, &replace, 4) != 4) + error ("lwrite"); + break; + } + } + + close (fd); +} + + + +volatile void error (str) + char *str; +{ + fprintf (stderr, "%s\n", str); + exit (1); +} |
