diff --git a/configure.in b/configure.in
index cce438fe076e67044a163451b3f9d87629e430e4..bc47064f8f7cfa2754eeaf60651b29077bf5daa6 100644
--- a/configure.in
+++ b/configure.in
@@ -290,13 +290,20 @@ AM_CONDITIONAL(BITQ, test $build_bitq = yes)
 AC_LANG_C
 AC_PROG_CC
 AC_PROG_RANLIB
-AC_PATH_PROG(TCLSH, tclsh)
 
-# quit if we have no tclsh
-if test "x${TCLSH}" = "x"; then
-	AC_MSG_ERROR([no working tclsh found])
+AC_CHECK_PROG(OBJDUMP, objdump, objdump)
+AC_CHECK_PROG(OBJCOPY, objcopy, objcopy)
+
+if test x${OBJDUMP} != x -a x${OBJCOPY} != x ; then
+	AC_MSG_CHECKING(objcopy command line)
+	AC_TRY_COMPILE(,,[OBJCOPY_format=`${OBJDUMP} -f conftest.$ac_objext | sed -e '/file format/!d' -e 's/.*format \(.*\)/\1/'`
+					  OBJCOPY_arch=`${OBJDUMP} -f conftest.$ac_objext | sed -e '/architecture/!d' -e 's/.*architecture: \(.*\),.*/\1/'`])
+	AC_MSG_RESULT(-I binary -O ${OBJCOPY_format} -B ${OBJCOPY_arch})
 fi
 
+AC_SUBST(OBJCOPY_FORMAT, ${OBJCOPY_format})
+AC_SUBST(OBJCOPY_ARCH, ${OBJCOPY_arch})
+
 AC_SUBST(WITH_FTD2XX, $with_ftd2xx)
 
 AC_OUTPUT(Makefile src/Makefile src/helper/Makefile src/jtag/Makefile src/xsvf/Makefile src/target/Makefile src/server/Makefile src/flash/Makefile src/pld/Makefile doc/Makefile)
diff --git a/src/Makefile.am b/src/Makefile.am
index 20b6425149739084083c3fea2ec000bc1f817461..2f1a221138a56934c05567415dc6ba672eff284e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -6,7 +6,7 @@ else
 MAINFILE = main.c jim.c
 endif
 
-openocd_SOURCES = $(MAINFILE) openocd.c startup.c
+openocd_SOURCES = $(MAINFILE) openocd.c
 
 # set the include path found by configure
 INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/helper \
@@ -70,7 +70,7 @@ FTD2XXLIB =
 endif
 endif
 
-openocd_LDADD = $(top_builddir)/src/xsvf/libxsvf.a \
+openocd_LDADD = $(top_builddir)/src/startup.o $(top_builddir)/src/xsvf/libxsvf.a \
 	$(top_builddir)/src/target/libtarget.a $(top_builddir)/src/jtag/libjtag.a \
 	$(top_builddir)/src/helper/libhelper.a \
 	$(top_builddir)/src/server/libserver.a $(top_builddir)/src/helper/libhelper.a \
@@ -96,9 +96,7 @@ nobase_dist_pkglib_DATA = \
 	tcl/mmr_helpers.tcl  \
 	tcl/readable.tcl  
 
-# Convert .tcl to .c file
-startup.c: $(top_srcdir)/src/startup.tcl Makefile  $(top_srcdir)/src/file2c.tcl
-	${TCLSH} $(top_srcdir)/src/file2c.tcl $(top_srcdir)/src/startup.tcl startup.c
+# Convert .tcl to object
 
-# add startup.c to make clean list
-CLEANFILES = startup.c
+$(top_builddir)/src/startup.o: $(top_srcdir)/src/startup.tcl
+	${OBJCOPY} -I binary -O ${OBJCOPY_FORMAT} -B ${OBJCOPY_ARCH} startup.tcl startup.o
diff --git a/src/file2c.tcl b/src/file2c.tcl
deleted file mode 100644
index 288751a1a8277c090c29a4827a0f097a2d8d3fce..0000000000000000000000000000000000000000
--- a/src/file2c.tcl
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/bin/bash
-# restart using a Tcl shell \
-	exec sh -c 'for tclshell in tclsh tclsh83 cygtclsh80 ; do \
-			( echo | $tclshell ) 2> /dev/null && exec $tclshell "`( cygpath -w \"$0\" ) 2> /dev/null || echo $0`" "$@" ; \
-		done ; \
-		echo "file2c.tcl: cannot find Tcl shell" ; exit 1' "$0" "$@"
-
-#===============================================================================
-#
-#    file2c.tcl
-#
-#    Convert a file into a header that can be #included from C.
-#
-#===============================================================================
-#####ECOSGPLCOPYRIGHTBEGIN####
-## -------------------------------------------
-## This file is part of eCos, the Embedded Configurable Operating System.
-## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-##
-## eCos is free software; you can redistribute it and/or modify it under
-## the terms of the GNU General Public License as published by the Free
-## Software Foundation; either version 2 or (at your option) any later version.
-##
-## eCos is distributed in the hope that it will be useful, but WITHOUT ANY
-## WARRANTY; without even the implied warranty of MERCHANTABILITY or
-## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-## for more details.
-##
-## You should have received a copy of the GNU General Public License along
-## with eCos; if not, write to the Free Software Foundation, Inc.,
-## 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
-##
-## As a special exception, if other files instantiate templates or use macros
-## or inline functions from this file, or you compile this file and link it
-## with other works to produce a work based on this file, this file does not
-## by itself cause the resulting work to be covered by the GNU General Public
-## License. However the source code for this file must still be made available
-## in accordance with section (3) of the GNU General Public License.
-##
-## This exception does not invalidate any other reasons why a work based on
-## this file might be covered by the GNU General Public License.
-##
-## Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
-## at http://sources.redhat.com/ecos/ecos-license/
-## -------------------------------------------
-#####ECOSGPLCOPYRIGHTEND####
-#===============================================================================
-######DESCRIPTIONBEGIN####
-#
-# Author(s):	jlarmour,bartv
-# Contact(s):	
-# Date:		2001-07-20
-# Purpose:      
-# Description:
-# Usage:        file2c.tcl <file to encode> <output C header file>
-#
-#####DESCRIPTIONEND####
-#===============================================================================
-
-
-
-if { $argc != 2 } {
-	puts "Usage: file2c.tcl <file to encode> <output C file>"
-	exit 1
-}
-set infile [lindex $argv 0]
-set outfile [lindex $argv 1]
-set label [string range $outfile [expr 1+[string last / $outfile]] [expr [string last . $outfile]-1]]
-
-set status [ catch {
-	set infilefd [open $infile "r"]
-	fconfigure $infilefd -translation binary
-	set data [read $infilefd]
-	close $infilefd
-} message]
-
-if { $status != 0 } {
-	error "Unable to read file $infile: $message"
-}
-
-set result ""
-
-set status [ catch {
-	set outfilefd [ open $outfile "w" ]
-} message ]
-
-if { $status != 0 } {
-	error "Unable to create file $outfile: $message"
-}
-
-append result "/* This is a generated file. Do not edit. */\n\n"
-append result "const unsigned char filedata_$label\[\] = {\n"
-
-set datalength [ string length $data ]
-
-set aligned_datalength [expr $datalength - ($datalength % 8)]
-
-for { set i 0 } {$i < $aligned_datalength} {incr i 8} {
-	binary scan $data "@[set i]H16" var0
-	append result [format "    0x%2s, 0x%2s, 0x%2s, 0x%2s, 0x%2s, 0x%2s, 0x%2s, 0x%2s,\n" \
-			[string range $var0  0  1] \
-			[string range $var0  2  3] \
-			[string range $var0  4  5] \
-			[string range $var0  6  7] \
-			[string range $var0  8  9] \
-			[string range $var0 10 11] \
-			[string range $var0 12 13] \
-			[string range $var0 14 15]]
-}
-
-if { $aligned_datalength != $datalength } {
-	append result "    "
-	for { set i $aligned_datalength } {$i < $datalength} {incr i} {
-		binary scan $data "@[set i]H2" var0
-		append result [format "0x%2s, " $var0]
-	}
-}
-
-# Remove either comma+newline or comma+space from the end
-set result [string range $result 0 [expr [string length $result] - 3]]
-
-append result "\n};"
-
-puts $outfilefd $result
-close $outfilefd
diff --git a/src/openocd.c b/src/openocd.c
index 8cac5530a48b49c1836531d5e1047da48b5dcd99..dcaca7847abee926d841dfcb3cc4c2969438500e 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -711,10 +711,14 @@ void add_jim(const char *name, int (*cmd)(Jim_Interp *interp, int argc, Jim_Obj
 	Jim_ListAppendElement(interp, helptext, cmd_entry);
 }
 
-extern const unsigned char filedata_startup[];
+extern char binary_startup_tcl_start;
+extern char binary_startup_tcl_size;
 
 void initJim(void)
 {
+	char *script;
+	int script_len;
+	
 	Jim_CreateCommand(interp, "openocd", Jim_Command_openocd, NULL, NULL);
 	Jim_CreateCommand(interp, "openocd_throw", Jim_Command_openocd_throw, NULL, NULL);
 	Jim_CreateCommand(interp, "find", Jim_Command_find, NULL, NULL);
@@ -734,23 +738,27 @@ void initJim(void)
 	
 	add_default_dirs();
 	
-	if (Jim_Eval(interp, filedata_startup)==JIM_ERR)
+	script_len = (int)&binary_startup_tcl_size;
+	script = malloc(script_len + sizeof(char));
+	memcpy(script, &binary_startup_tcl_start, script_len);
+	
+	/* null terminate */
+	script[script_len] = 0;
+	
+	if (Jim_Eval(interp, script)==JIM_ERR)
 	{
 		LOG_ERROR("Failed to run startup.tcl (embedded into OpenOCD compile time)");
 		Jim_PrintErrorMessage(interp);
 		exit(-1);
 	}
+	
+	free(script);
 }
 
-
-
 int handle_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-	FILE *script_file;
-
 	if (argc != 1)
 		return ERROR_COMMAND_SYNTAX_ERROR;
-
 	
 	/* Run a tcl script file */
 	return command_run_linef(cmd_ctx, "source [find {%s}]", args[0]);
diff --git a/testing/tcl_server.tcl b/testing/tcl_server.tcl
index c5ec229171bc09689e69f8faf3111620440866b0..2e229c10660c694e53695e1e6b6d46a1b47d1047 100644
--- a/testing/tcl_server.tcl
+++ b/testing/tcl_server.tcl
@@ -1,15 +1,15 @@
-# Simple tcl client to connect to openocd
-puts "Use empty line to exit"
-set fo [socket 127.0.0.1 6666]
-puts -nonewline stdout "> "
-flush stdout
-while {[gets stdin line] >= 0} {
-    if {$line eq {}} break
-    puts $fo $line
-    flush $fo
-    gets $fo line
-    puts $line
-    puts -nonewline stdout "> "
-    flush stdout
-}
-close $fo
+# Simple tcl client to connect to openocd
+puts "Use empty line to exit"
+set fo [socket 127.0.0.1 6666]
+puts -nonewline stdout "> "
+flush stdout
+while {[gets stdin line] >= 0} {
+    if {$line eq {}} break
+    puts $fo $line
+    flush $fo
+    gets $fo line
+    puts $line
+    puts -nonewline stdout "> "
+    flush stdout
+}
+close $fo
diff --git a/testing/tcl_test.tcl b/testing/tcl_test.tcl
index 683b4fe572057c5b672bbad8067b79e7130a5baf..476e1c21a014c8fbea325bb89d6f56eadcc4a9d1 100644
--- a/testing/tcl_test.tcl
+++ b/testing/tcl_test.tcl
@@ -1,65 +1,65 @@
-if { $argc != 1 } {
-	puts "Usage: test_tcl.tcl <ipaddress>"
-	exit 1
-}
-
-puts $argv
-
-# Simple tcl client to connect to openocd
-global fo
-set fo [socket $argv 6666]
-
-# If a fn is unknown to Tcl, send it off to OpenOCD
-proc unknown args {	
-	global fo
-	puts $fo $args
-	flush $fo
-	gets $fo line
-	return $line
-}
-
-
-
-#Print help text for a command. Word wrap
-#help text that is too wide inside column.
-proc pc_help {args} {
-	global ocd_helptext
-	set cmd $args
-	foreach a [lsort $ocd_helptext] {
-		if {[string length $cmd]==0||[string first $cmd $a]!=-1||[string first $cmd [lindex $a 1]]!=-1} {
-			set w 50
-			set cmdname [lindex $a 0]
-			set h [lindex $a 1]
-			set n 0
-			while 1 {
-				if {$n > [string length $h]} {break}
-				
-				set next_a [expr $n+$w]
-				if {[string length $h]>$n+$w} {
-					set xxxx [string range $h $n [expr $n+$w]]
-					for {set lastpos [expr [string length $xxxx]-1]} {$lastpos>=0&&[string compare [string range $xxxx $lastpos $lastpos] " "]!=0} {set lastpos [expr $lastpos-1]} {
-					}
-					#set next_a -1
-					if {$lastpos!=-1} {
-						set next_a [expr $lastpos+$n+1]
-					}
-				}
-				
-				
-				puts [format "%-25s %s" $cmdname [string range $h $n [expr $next_a-1]] ]
-				set cmdname ""
-				set n [expr $next_a]
-			}
-		}
-	}
-}
-
-puts "Running flash_banks"
-puts [flash_banks]
-puts "Running help on PC using data from OpenOCD"
-global ocd_helptext
-set ocd_helptext [get_help_text]
-puts [pc_help]
-
-
-
+if { $argc != 1 } {
+	puts "Usage: test_tcl.tcl <ipaddress>"
+	exit 1
+}
+
+puts $argv
+
+# Simple tcl client to connect to openocd
+global fo
+set fo [socket $argv 6666]
+
+# If a fn is unknown to Tcl, send it off to OpenOCD
+proc unknown args {	
+	global fo
+	puts $fo $args
+	flush $fo
+	gets $fo line
+	return $line
+}
+
+
+
+#Print help text for a command. Word wrap
+#help text that is too wide inside column.
+proc pc_help {args} {
+	global ocd_helptext
+	set cmd $args
+	foreach a [lsort $ocd_helptext] {
+		if {[string length $cmd]==0||[string first $cmd $a]!=-1||[string first $cmd [lindex $a 1]]!=-1} {
+			set w 50
+			set cmdname [lindex $a 0]
+			set h [lindex $a 1]
+			set n 0
+			while 1 {
+				if {$n > [string length $h]} {break}
+				
+				set next_a [expr $n+$w]
+				if {[string length $h]>$n+$w} {
+					set xxxx [string range $h $n [expr $n+$w]]
+					for {set lastpos [expr [string length $xxxx]-1]} {$lastpos>=0&&[string compare [string range $xxxx $lastpos $lastpos] " "]!=0} {set lastpos [expr $lastpos-1]} {
+					}
+					#set next_a -1
+					if {$lastpos!=-1} {
+						set next_a [expr $lastpos+$n+1]
+					}
+				}
+				
+				
+				puts [format "%-25s %s" $cmdname [string range $h $n [expr $next_a-1]] ]
+				set cmdname ""
+				set n [expr $next_a]
+			}
+		}
+	}
+}
+
+puts "Running flash_banks"
+puts [flash_banks]
+puts "Running help on PC using data from OpenOCD"
+global ocd_helptext
+set ocd_helptext [get_help_text]
+puts [pc_help]
+
+
+