96 lines
2.1 KiB
C
96 lines
2.1 KiB
C
|
/******************************************************************************
|
||
|
* Copyright (c) 2004, 2008 IBM Corporation
|
||
|
* All rights reserved.
|
||
|
* This program and the accompanying materials
|
||
|
* are made available under the terms of the BSD License
|
||
|
* which accompanies this distribution, and is available at
|
||
|
* http://www.opensource.org/licenses/bsd-license.php
|
||
|
*
|
||
|
* Contributors:
|
||
|
* IBM Corporation - initial implementation
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
static int reloc_64_cnt;
|
||
|
|
||
|
static int reloc_64[4096];
|
||
|
|
||
|
static void
|
||
|
output_int(FILE *output_file, int i)
|
||
|
{
|
||
|
fputc((i>>24) & 0xff, output_file);
|
||
|
fputc((i>>16) & 0xff, output_file);
|
||
|
fputc((i>>8) & 0xff, output_file);
|
||
|
fputc(i & 0xff, output_file);
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
output_reloc_table(FILE * output_file, int reloc_cnt, int reloc[])
|
||
|
{
|
||
|
int i;
|
||
|
for (i=0; i < reloc_cnt; i++)
|
||
|
{
|
||
|
#ifdef DEBUG
|
||
|
printf ("reloc %x\n", reloc[i]);
|
||
|
#endif
|
||
|
output_int (output_file, reloc[i]);
|
||
|
}
|
||
|
if ((reloc_cnt & 1) == 0)
|
||
|
output_int (output_file, 0);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
main(int argc, char *argv[])
|
||
|
{
|
||
|
int cnt_a, cnt_b, offset = -1;
|
||
|
unsigned char a, b;
|
||
|
FILE *orig, *other, *output_file;
|
||
|
|
||
|
if (argc != 4)
|
||
|
{
|
||
|
fprintf (stderr, "reloc_diff orig_file other_file output_file\n");
|
||
|
exit(-1);
|
||
|
}
|
||
|
|
||
|
orig = fopen(argv[1], "rb");
|
||
|
other = fopen(argv[2], "rb");
|
||
|
output_file = fopen(argv[3], "wb");
|
||
|
if(orig == NULL || other == NULL || output_file == NULL) {
|
||
|
printf("Could not open file.\n");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
cnt_a = fread(&a, 1, 1, orig);
|
||
|
cnt_b = fread(&b, 1, 1, other);
|
||
|
offset ++;
|
||
|
if (cnt_a != cnt_b)
|
||
|
{
|
||
|
fprintf (stderr, "Files >%s< and >%s< have not the same length\n",argv[1],argv[2]);
|
||
|
exit(-1);
|
||
|
}
|
||
|
|
||
|
if (cnt_a == 0)
|
||
|
break;
|
||
|
|
||
|
if (a == b) continue;
|
||
|
|
||
|
if (a + 0x40 == b)
|
||
|
{
|
||
|
reloc_64[reloc_64_cnt++] = offset;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fprintf(stderr, "Unknown relocation");
|
||
|
fprintf(stderr, "Offset %x: %02x %02x\n", offset, a, b);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
output_reloc_table(output_file, reloc_64_cnt, reloc_64);
|
||
|
return 0;
|
||
|
}
|