1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/******************************************************************************
* 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;
}
|