OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [tools/] [build/] [binpatch.c] - Rev 620

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 *  $Id: binpatch.c,v 1.2 2001-09-27 12:02:53 chris Exp $
 */
 
 
#include <stdio.h>
#include <stdlib.h>
 
/*
 * This function will patch binary file
 */
 
 
static char buf[512];
 
static void 
usage(void)
{
  printf("usage: binpatch [-h] <ofile> <ifile> <reloc> <off> <byte0> "
         "[<byte1> [<byte2> [<byte3>]]]\n");
  printf("this function patches binary file at specified offset with\n");
  printf("up to 4 bytes provided on command line \n");
  printf("-h       - prints this message\n\n");
  printf("<ofile>  - output file\n");
  printf("<ifile>  - input ifile\n");
  printf("<reloc>  - relocation address of image\n");
  printf("<off>    - offset of patch, offset in file is at off - reloc\n");
  printf("<byte0>  - byte 0 of patch\n");
  printf("<byte1>  - byte 1 of patch\n");
  printf("<byte2>  - byte 1 of patch\n");
  printf("<byte3>  - byte 1 of patch\n");
 
  return;
}
 
int
main(int argc, char **argv)
{
  int   c;
  FILE  *ofp, *ifp;
  char  patch[4], *end;
  int   patchLen, tmp, i, off, cnt, patched, len, reloc;
 
 
  /* parse command line options */
  while ((c = getopt(argc, argv, "h")) >= 0)
    {
      switch (c)
	{
	case 'h':
	  usage();
	  return 0;
	default:
	  usage();
	  return 1;
	}
    }
 
  if(argc < 6)
    {
      usage();
      return 1;
    }
 
  /* Let us get offset in file */
  reloc = strtol(argv[3], &end, 0);
  if(end == argv[3] || off < 0)
    {
      fprintf(stderr, "bad reloc value %s\n", argv[3]);
      return 1;
    }
 
  off = strtol(argv[4], &end, 0);
  if(end == argv[4] || off < 0 || off < reloc)
    {
      fprintf(stderr, "bad offset value %s\n", argv[4]);
      return 1;
    }
 
  off -= reloc;
 
  /* Let us get patch  */
  patchLen = argc - 5;
 
  for(i=0; i<patchLen; i++)
    {
      tmp = strtol(argv[5+i], &end, 0);
 
      if(end == argv[4+i] || tmp < 0 || tmp > 0xff)
	{
	  fprintf(stderr, "bad byte value %s\n", argv[5+i]);
	  return 1;
	}
      patch[i] = tmp;
    }
 
  ifp = fopen(argv[2], "r");
  if(ifp == NULL)
    {
      fprintf(stderr, "unable to open file %s\n", argv[2]);
      return 1;
    }
 
  ofp = fopen(argv[1], "w");
  if(ofp == NULL)
    {
      fprintf(stderr, "unable to open file %s\n", argv[1]);
      return 1;
    }
 
  cnt     = 0;
  patched = 0;
  for(;;)
    {
      len = fread(buf, 1, sizeof(buf), ifp);
 
      if(len == 0)
	{
	  break;
	}
 
      if(cnt <= off && (cnt + len) > off)
	{
	  /* Perform patch */
	  for(i=0; i<patchLen && (off+i)<(cnt+len); i++)
	    {
	      buf[off-cnt+i] = patch[i];
	    }
	  patched = 1;
	}
      else if(cnt > off && cnt < (off + patchLen))
	{
	  /* Perform patch */
	  for(i=cnt-off; i<patchLen; i++)
	    {
	      buf[off-cnt+i] = patch[i];
	    }
	  patched = 1;
	}
 
      fwrite(buf, 1, len, ofp);
 
      cnt += len;
    }
 
  fclose(ifp);
  fclose(ofp);
 
  if(!patched)
    {
      fprintf(stderr, "warning: offset is beyond input file length\n");
      fprintf(stderr, "         no patch is performed\n");
    }
 
  return 0;
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.