/****************************************************************************** * 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 #include 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; }