genchecksum.c revision 285830
150276Speter/* Generate checksums of executables for PCH validation 250276Speter Copyright (C) 2005 350276Speter Free Software Foundation, Inc. 450276Speter 550276SpeterThis file is part of GCC. 650276Speter 750276SpeterGCC is free software; you can redistribute it and/or modify it under 850276Speterthe terms of the GNU General Public License as published by the Free 950276SpeterSoftware Foundation; either version 2, or (at your option) any later 1050276Speterversion. 1150276Speter 1250276SpeterGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1350276SpeterWARRANTY; without even the implied warranty of MERCHANTABILITY or 1450276SpeterFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1550276Speterfor more details. 1650276Speter 1750276SpeterYou should have received a copy of the GNU General Public License 1850276Speteralong with GCC; see the file COPYING. If not, write to the Free 1950276SpeterSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 2050276Speter02110-1301, USA. */ 2150276Speter 2250276Speter#include "bconfig.h" 2350276Speter#include "system.h" 2450276Speter#include "md5.h" 2550276Speter 2650276Speterstatic void 2750276Speterusage (void) 2850276Speter{ 2950276Speter fputs ("Usage: genchecksums <filename>\n", stderr); 3050276Speter} 3150276Speter 3250276Speterstatic void 3350276Speterdosum (const char *file) 3450276Speter{ 3550276Speter FILE *f; 3650276Speter unsigned char result[16]; 3750276Speter int i; 3850276Speter 3950276Speter f = fopen (file, "rb"); 4050276Speter if (!f) 4150276Speter { 4250276Speter fprintf (stderr, "opening %s: %s\n", file, xstrerror (errno)); 4350276Speter exit (1); 4450276Speter } 4550276Speter 4650276Speter /* Some executable formats have timestamps in the first 16 bytes, yuck. */ 4750276Speter if (fseek (f, 16, SEEK_SET) != 0) 4850276Speter { 4950276Speter fprintf (stderr, "seeking in %s: %s\n", file, xstrerror (errno)); 5050276Speter exit (1); 5150276Speter } 5250276Speter 5350276Speter if (md5_stream (f, result) != 0 5450276Speter || fclose (f) != 0) 5550276Speter { 5650276Speter fprintf (stderr, "reading %s: %s\n", file, xstrerror (errno)); 5750276Speter exit (1); 5850276Speter } 5950276Speter 6050276Speter fputs ("const unsigned char executable_checksum[16] = { ", stdout); 6150276Speter for (i = 0; i < 16; i++) 6250276Speter printf ("%#02x%s", result[i], i == 15 ? " };\n" : ", "); 6350276Speter} 6450276Speter 6550276Speterint 6650276Spetermain (int argc, char ** argv) 6750276Speter{ 6850276Speter if (argc != 2) 6950276Speter { 7050276Speter usage (); 7150276Speter return 1; 7250276Speter } 7350276Speter 7450276Speter dosum (argv[1]); 7550276Speter 7650276Speter return 0; 7750276Speter} 7850276Speter