Index: fileio.c
===================================================================
--- fileio.c	(revision 947)
+++ fileio.c	(working copy)
@@ -89,6 +89,8 @@
     case FMT_SREC : return "Motorola S-Record"; break;
     case FMT_IHEX : return "Intel Hex"; break;
     case FMT_RBIN : return "raw binary"; break;
+    case FMT_ELF  : return "ELF (Executable and Linkable Format)"; break;
+    case FMT_COFF : return "AVR COFF"; break;
     default       : return "invalid format"; break;
   };
 }
@@ -947,6 +949,7 @@
   int i;
   int len;
   int found;
+  int first_row = 1;
 
   f = fopen(fname, "r");
   if (f == NULL) {
@@ -961,6 +964,18 @@
     if (buf[len-1] == '\n')
       buf[--len] = 0;
 
+    if (buf[0] == 0x7F && buf[1] == 'E' && buf[2] == 'L' && buf[3] == 'F'
+      && first_row) {
+      fclose(f);
+      return FMT_ELF;
+    }
+
+    /* There are COFF files with different signatures, I hope non-AVR. */
+    if (buf[0] == 0x12 && buf[1] == 0x0A && first_row) {
+      fclose(f);
+      return FMT_COFF;
+    }
+
     /* check for binary data */
     found = 0;
     for (i=0; i<len; i++) {
@@ -1003,6 +1018,8 @@
         return FMT_SREC;
       }
     }
+
+    first_row = 0;
   }
 
   fclose(f);
@@ -1124,6 +1141,16 @@
       rc = fileio_rbin(&fio, fname, f, buf, size);
       break;
 
+    case FMT_ELF:
+      fprintf(stderr, "%s: %s %s ELF file format is not supported yet\n",
+              progname, fio.iodesc, fio.dir);
+      return -1;
+
+    case FMT_COFF:
+      fprintf(stderr, "%s: %s %s AVR COFF file format is not supported yet\n",
+              progname, fio.iodesc, fio.dir);
+      return -1;
+
     case FMT_IMM:
       rc = fileio_imm(&fio, fname, f, buf, size);
       break;
Index: fileio.h
===================================================================
--- fileio.h	(revision 947)
+++ fileio.h	(working copy)
@@ -26,12 +26,14 @@
   FMT_AUTO,
   FMT_SREC,
   FMT_IHEX,
-  FMT_RBIN,
+  FMT_RBIN, /* a file with raw data or in unrecognized format */
+  FMT_ELF,
+  FMT_COFF, /* a file in AVR variant of COFF format */
   FMT_IMM,
   FMT_HEX,
   FMT_DEC,
   FMT_OCT,
-  FMT_BIN
+  FMT_BIN /* a literal binary number, e.g. for fuses */
 } FILEFMT;
 
 struct fioparms {
Index: update.c
===================================================================
--- update.c	(revision 947)
+++ update.c	(working copy)
@@ -138,6 +138,8 @@
       case 's': upd->format = FMT_SREC; break;
       case 'i': upd->format = FMT_IHEX; break;
       case 'r': upd->format = FMT_RBIN; break;
+      case 'e': upd->format = FMT_ELF; break;
+      case 'c': upd->format = FMT_COFF; break;
       case 'm': upd->format = FMT_IMM; break;
       case 'b': upd->format = FMT_BIN; break;
       case 'd': upd->format = FMT_DEC; break;
@@ -259,7 +261,7 @@
     }
     rc = fileio(FIO_READ, upd->filename, upd->format, p, upd->memtype, -1);
     if (rc < 0) {
-      fprintf(stderr, "%s: write to file '%s' failed\n",
+      fprintf(stderr, "%s: read from file '%s' failed\n",
               progname, upd->filename);
       return -1;
     }
