Source-Changes-HG archive

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

[src/trunk]: src Rewrite binpatch(8) utility to add support for ELF binaries,



details:   https://anonhg.NetBSD.org/src/rev/079bfe79f1e1
branches:  trunk
changeset: 746815:079bfe79f1e1
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Thu Aug 20 15:14:49 2009 +0000

description:
Rewrite binpatch(8) utility to add support for ELF binaries,
using implementation of old src/usr.sbin/mdsetimage sources
which supports misc executable formats without LGPL'ed libbfd.

No particular comments on port-atari@.

XXX1: amiga also has the similar utility in amiga/stand/binpatch
      but it has slightly different options.
XXX2: Is it worth to put this utility into MI src/usr.sbin to patch
      rtc_offset etc. in GENERIC kernel binaries in distribution?

diffstat:

 share/man/man8/man8.atari/binpatch.8     |   74 +++-
 sys/arch/atari/stand/binpatch/Makefile   |   53 ++-
 sys/arch/atari/stand/binpatch/binpatch.c |  505 +++++++++++++++++++-----------
 3 files changed, 430 insertions(+), 202 deletions(-)

diffs (truncated from 747 to 300 lines):

diff -r d2a3cf59105b -r 079bfe79f1e1 share/man/man8/man8.atari/binpatch.8
--- a/share/man/man8/man8.atari/binpatch.8      Thu Aug 20 14:43:06 2009 +0000
+++ b/share/man/man8/man8.atari/binpatch.8      Thu Aug 20 15:14:49 2009 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: binpatch.8,v 1.5 2001/12/26 01:26:44 wiz Exp $
+.\"    $NetBSD: binpatch.8,v 1.6 2009/08/20 15:14:49 tsutsui Exp $
 .\"
 .\" Copyright (c) 1994 Christian E. Hopps
 .\" All rights reserved.
@@ -28,22 +28,24 @@
 .\" (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
+.Dd August 20, 2009
 .Dt BINPATCH 8 atari
 .Os
 .Sh NAME
 .Nm binpatch
-.Nd "examine and or modify initialized data in a binary file"
+.Nd "examine and or modify initialized data in an executable binary"
 .Sh SYNOPSIS
 .Nm binpatch
-.Op Fl b | Fl w | Fl l
+.Op Fl b | Fl w | Fl l | Fl d
 .Op Fl o Ar offset
+.Op Fl T Ar saddr
 .Fl s Ar symname
 .Op Fl r Ar value
 .Ar binfile
 .Nm binpatch
-.Op Fl b | Fl w | Fl l
+.Op Fl b | Fl w | Fl l | Fl d
 .Op Fl o Ar offset
+.Op Fl T Ar saddr
 .Fl a Ar addr
 .Op Fl r Ar value
 .Ar binfile
@@ -52,20 +54,39 @@
 is used to modify or examine the data associated with a symbol in a binary
 file
 .Ar binfile .
+.Pp
 The flags
 .Fl b ,
+.Fl w ,
+.Fl l ,
+and
+.Fl d
+specify the size of the data to be modified or examined.
+.Fl b
+is for 8bit
+.Pq Li int8_t ,
 .Fl w
-and
+is for 16bit
+.Pq Li int16_t ,
 .Fl l
-specify the size of the data to be modified or examined
-(byte, word and long respectively.) The
+is for 32bit
+.Pq Li int32_t ,
+and
+.Fl d
+is for 64bit
+.Pq Li int64_t
+variables.
+.Pp
+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
+If the symbol is found the current data and address are printed.
+.Pp
+Next if the
 .Fl r
 flag has been given, the current data is replaced with that of
 .Ar value .
@@ -79,11 +100,17 @@
 .Pp
 The
 .Fl o
-flag specifies an offset in byte, word or long
+flag specifies an offset in
+.Li int8_t ,
+.Li int16_t ,
+.Li int32_t ,
+and
+.Li int64_t
 .Fl ( b ,
 .Fl w ,
+.Fl l ,
 or
-.Fl l )
+.Fl d )
 units from the given locator
 .Fl ( s
 or
@@ -91,3 +118,28 @@
 for
 .Nm
 to perform its described actions.
+This might be useful to patch a member of array or structure.
+.Pp
+The
+.Fl T
+flag is used to specify the starting address of a.out binary text segment.
+Ignored for other binary executable formats.
+.Sh SEE ALSO
+.Xr gdb 1 ,
+.Xr mdsetimage 8
+.Sh BUGS
+The
+.Nm
+command doesn't check if size of specified symbol is same with the
+specified size by
+.Fl b ,
+.Fl w ,
+.Fl l ,
+or
+.Fl d
+flag.
+.Pp
+The
+.Nm
+command doesn't check if specified address or symbol is a patchable variable
+and it might corrupts the specified executable binary.
diff -r d2a3cf59105b -r 079bfe79f1e1 sys/arch/atari/stand/binpatch/Makefile
--- a/sys/arch/atari/stand/binpatch/Makefile    Thu Aug 20 14:43:06 2009 +0000
+++ b/sys/arch/atari/stand/binpatch/Makefile    Thu Aug 20 15:14:49 2009 +0000
@@ -1,9 +1,50 @@
-#      $NetBSD: Makefile,v 1.5 2001/12/12 01:49:38 tv Exp $
+#      $NetBSD: Makefile,v 1.6 2009/08/20 15:14:49 tsutsui Exp $
+
+BINDIR?= /sbin
+WARNS?=        4
+
+PROG=  binpatch
+SRCS=  binpatch.c
+SRCS+= exec_aout.c exec_ecoff.c exec_elf32.c exec_elf64.c exec_coff.c
+
+#MAN=  binpatch.8      # currently it's in src/share/man/man8/man8.atari
+NOMAN=
+
+MDSETIMAGE=${NETBSDSRCDIR}/usr.sbin/mdsetimage
+CPPFLAGS+= -I${MDSETIMAGE}
+.PATH: ${MDSETIMAGE}
+
+.include <bsd.own.mk>  # for ${MACHINE_CPU}
 
-PROG=binpatch
-NOMAN= # defined
-
-BINDIR=/sbin
-LDFLAGS+=-static
+.if    ${MACHINE_ARCH} == "alpha"
+CPPFLAGS+=-DNLIST_ECOFF
+CPPFLAGS+=-DNLIST_ELF64
+.elif  ${MACHINE_CPU} == "mips"
+CPPFLAGS+=-DNLIST_ECOFF
+CPPFLAGS+=-DNLIST_ELF32
+CPPFLAGS+=-DNLIST_AOUT
+.elif  ${MACHINE_ARCH} == "powerpc"
+CPPFLAGS+=-DNLIST_ELF32
+.elif  ${MACHINE_ARCH} == "m68k" || \
+       ${MACHINE_ARCH} == "m68000" || \
+       ${MACHINE_ARCH} == "vax" || \
+       ${MACHINE_CPU} == "arm"
+CPPFLAGS+=-DNLIST_ELF32
+CPPFLAGS+=-DNLIST_AOUT
+.elif  ${MACHINE_CPU} == "sh3"
+CPPFLAGS+=-DNLIST_COFF
+CPPFLAGS+=-DNLIST_ELF32
+.elif   ${MACHINE_ARCH} == "sparc" || ${MACHINE_ARCH} == "sparc64"  || \
+       ${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "x86_64"
+CPPFLAGS+=-DNLIST_ELF64
+CPPFLAGS+=-DNLIST_ELF32
+CPPFLAGS+=-DNLIST_AOUT
+.else
+#CPPFLAGS+=-DNLIST_AOUT
+#CPPFLAGS+=-DNLIST_ECOFF
+CPPFLAGS+=-DNLIST_ELF32
+#CPPFLAGS+=-DNLIST_ELF64
+#CPPFLAGS+=-DNLIST_COFF
+.endif
 
 .include <bsd.prog.mk>
diff -r d2a3cf59105b -r 079bfe79f1e1 sys/arch/atari/stand/binpatch/binpatch.c
--- a/sys/arch/atari/stand/binpatch/binpatch.c  Thu Aug 20 14:43:06 2009 +0000
+++ b/sys/arch/atari/stand/binpatch/binpatch.c  Thu Aug 20 15:14:49 2009 +0000
@@ -1,8 +1,7 @@
-/*     $NetBSD: binpatch.c,v 1.5 2009/03/14 21:04:07 dsl Exp $ */
+/* $NetBSD: binpatch.c,v 1.6 2009/08/20 15:14:49 tsutsui Exp $ */
 
-/*
- * Copyright (c) 1994 Christian E. Hopps
- * All rights reserved.
+/*-
+ * Copyright (c) 2009 Izumi Tsutsui.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -12,11 +11,6 @@
  * 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.
- * 4. 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
@@ -30,211 +24,352 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+/*
+ * Copyright (c) 1996 Christopher G. Demetriou
+ * 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. 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.
+ * 
+ * <<Id: LICENSE_GC,v 1.1 2001/10/01 23:24:05 cgd Exp>>
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__COPYRIGHT("@(#) Copyright (c) 1996\
+ Christopher G. Demetriou.  All rights reserved.");
+#endif /* not lint */
+
+#ifndef lint
+__RCSID("$NetBSD: binpatch.c,v 1.6 2009/08/20 15:14:49 tsutsui Exp $");
+#endif /* not lint */
+
 #include <sys/types.h>
-#include <a.out.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/inttypes.h>
+
+#include <err.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <nlist.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
 
-extern char *optarg;
-extern int optind;
+#include "extern.h"
+
+int            main(int, char *[]);
+static void    usage(void) __dead;
 
-void error (char *) __attribute__((__noreturn__));
+bool replace, verbose;
+u_long addr, offset;
+char *symbol;
+size_t size;
+uint64_t val;
+       
+#ifdef NLIST_AOUT
+/*
+ * Since we can't get the text address from an a.out executable, we
+ * need to be able to specify it.  Note: there's no way to test to
+ * see if the user entered a valid address!
+ */
+int    T_flag_specified;       /* the -T flag was specified */
+u_long text_start;             /* Start of kernel text */
+#endif /* NLIST_AOUT */
 



Home | Main Index | Thread Index | Old Index