diff -Nur git-1.7.3.2-orig/builtin/daemon.c git-1.7.3.2/builtin/daemon.c
--- git-1.7.3.2-orig/builtin/daemon.c	1970-01-01 01:00:00.000000000 +0100
+++ git-1.7.3.2/builtin/daemon.c	2010-11-17 12:30:47.977921001 +0100
@@ -0,0 +1 @@
+#include "../daemon.c"
diff -Nur git-1.7.3.2-orig/builtin/fast-import.c git-1.7.3.2/builtin/fast-import.c
--- git-1.7.3.2-orig/builtin/fast-import.c	1970-01-01 01:00:00.000000000 +0100
+++ git-1.7.3.2/builtin/fast-import.c	2010-11-17 12:30:47.977921001 +0100
@@ -0,0 +1 @@
+#include "../fast-import.c"
diff -Nur git-1.7.3.2-orig/builtin/http-backend.c git-1.7.3.2/builtin/http-backend.c
--- git-1.7.3.2-orig/builtin/http-backend.c	1970-01-01 01:00:00.000000000 +0100
+++ git-1.7.3.2/builtin/http-backend.c	2010-11-17 12:30:47.977921001 +0100
@@ -0,0 +1 @@
+#include "../http-backend.c"
diff -Nur git-1.7.3.2-orig/builtin/imap-send.c git-1.7.3.2/builtin/imap-send.c
--- git-1.7.3.2-orig/builtin/imap-send.c	1970-01-01 01:00:00.000000000 +0100
+++ git-1.7.3.2/builtin/imap-send.c	2010-11-17 12:30:47.977921001 +0100
@@ -0,0 +1 @@
+#include "../imap-send.c"
diff -Nur git-1.7.3.2-orig/builtin/shell.c git-1.7.3.2/builtin/shell.c
--- git-1.7.3.2-orig/builtin/shell.c	1970-01-01 01:00:00.000000000 +0100
+++ git-1.7.3.2/builtin/shell.c	2010-11-17 12:30:47.977921001 +0100
@@ -0,0 +1 @@
+#include "../shell.c"
diff -Nur git-1.7.3.2-orig/builtin/upload-pack.c git-1.7.3.2/builtin/upload-pack.c
--- git-1.7.3.2-orig/builtin/upload-pack.c	1970-01-01 01:00:00.000000000 +0100
+++ git-1.7.3.2/builtin/upload-pack.c	2010-11-17 12:30:47.977921001 +0100
@@ -0,0 +1 @@
+#include "../upload-pack.c"
diff -Nur git-1.7.3.2-orig/builtin.h git-1.7.3.2/builtin.h
--- git-1.7.3.2-orig/builtin.h	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/builtin.h	2010-11-17 12:30:47.977921001 +0100
@@ -139,5 +139,11 @@
 extern int cmd_show_ref(int argc, const char **argv, const char *prefix);
 extern int cmd_pack_refs(int argc, const char **argv, const char *prefix);
 extern int cmd_replace(int argc, const char **argv, const char *prefix);
+extern int cmd_shell(int argc, char **argv, const char *prefix);
+extern int cmd_upload_pack(int argc, char **argv, const char *prefix);
+extern int cmd_http_backend(int argc, char **argv, const char *prefix);
+extern int cmd_daemon(int argc, char **argv, const char *prefix);
+extern int cmd_imap_send(int argc, char **argv, const char *prefix);
+extern int cmd_fast_import(int argc, const char **argv, const char *prefix);
 
 #endif
diff -Nur git-1.7.3.2-orig/daemon.c git-1.7.3.2/daemon.c
--- git-1.7.3.2-orig/daemon.c	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/daemon.c	2010-11-17 12:30:47.977921001 +0100
@@ -963,7 +963,7 @@
 	return service_loop(socknum, socklist);
 }
 
-int main(int argc, char **argv)
+int cmd_daemon(int argc, char **argv, const char *prefix)
 {
 	int listen_port = 0;
 	char *listen_addr = NULL;
diff -Nur git-1.7.3.2-orig/fast-import.c git-1.7.3.2/fast-import.c
--- git-1.7.3.2-orig/fast-import.c	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/fast-import.c	2010-11-17 12:30:47.977921001 +0100
@@ -2912,7 +2912,7 @@
 		read_marks();
 }
 
-int main(int argc, const char **argv)
+int cmd_fast_import(int argc, const char **argv, const char *prefix)
 {
 	unsigned int i;
 
diff -Nur git-1.7.3.2-orig/git.c git-1.7.3.2/git.c
--- git-1.7.3.2-orig/git.c	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/git.c	2010-11-17 12:30:47.977921001 +0100
@@ -240,11 +240,11 @@
 
 struct cmd_struct {
 	const char *cmd;
-	int (*fn)(int, const char **, const char *);
+	int (*fn)(int, char **, const char *);
 	int option;
 };
 
-static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
+static int run_builtin(struct cmd_struct *p, int argc, char **argv)
 {
 	int status, help;
 	struct stat st;
@@ -293,7 +293,7 @@
 	return 0;
 }
 
-static void handle_internal_command(int argc, const char **argv)
+static void handle_internal_command(int argc, char **argv)
 {
 	const char *cmd = argv[0];
 	static struct cmd_struct commands[] = {
@@ -405,6 +405,12 @@
 		{ "verify-pack", cmd_verify_pack },
 		{ "show-ref", cmd_show_ref, RUN_SETUP },
 		{ "pack-refs", cmd_pack_refs, RUN_SETUP },
+		{ "shell", cmd_shell },
+		{ "upload-pack", cmd_upload_pack },
+		{ "http-backend", cmd_http_backend },
+		{ "daemon", cmd_daemon },
+		{ "imap-send", cmd_imap_send },
+		{ "fast-import", cmd_fast_import },
 	};
 	int i;
 	static const char ext[] = STRIP_EXTENSION;
diff -Nur git-1.7.3.2-orig/http-backend.c git-1.7.3.2/http-backend.c
--- git-1.7.3.2-orig/http-backend.c	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/http-backend.c	2010-11-17 12:30:47.977921001 +0100
@@ -542,7 +542,7 @@
 	{"POST", "/git-receive-pack$", service_rpc}
 };
 
-int main(int argc, char **argv)
+int cmd_http_backend(int argc, char **argv, const char *prefix)
 {
 	char *method = getenv("REQUEST_METHOD");
 	char *dir;
diff -Nur git-1.7.3.2-orig/imap-send.c git-1.7.3.2/imap-send.c
--- git-1.7.3.2-orig/imap-send.c	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/imap-send.c	2010-11-17 12:30:47.977921001 +0100
@@ -1528,7 +1528,7 @@
 	return 0;
 }
 
-int main(int argc, char **argv)
+int cmd_imap_send(int argc, char **argv, const char *prefix)
 {
 	struct msg_data all_msgs, msg;
 	struct store *ctx = NULL;
diff -Nur git-1.7.3.2-orig/Makefile git-1.7.3.2/Makefile
--- git-1.7.3.2-orig/Makefile	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/Makefile	2010-11-17 12:46:11.309922603 +0100
@@ -398,12 +398,7 @@
 # ... and all the rest that could be moved out of bindir to gitexecdir
 PROGRAMS += $(EXTRA_PROGRAMS)
 
-PROGRAM_OBJS += fast-import.o
-PROGRAM_OBJS += imap-send.o
-PROGRAM_OBJS += shell.o
 PROGRAM_OBJS += show-index.o
-PROGRAM_OBJS += upload-pack.o
-PROGRAM_OBJS += http-backend.o
 
 PROGRAMS += $(patsubst %.o,git-%$X,$(PROGRAM_OBJS))
 
@@ -750,6 +745,12 @@
 BUILTIN_OBJS += builtin/verify-pack.o
 BUILTIN_OBJS += builtin/verify-tag.o
 BUILTIN_OBJS += builtin/write-tree.o
+BUILTIN_OBJS += builtin/shell.o
+BUILTIN_OBJS += builtin/upload-pack.o
+BUILTIN_OBJS += builtin/http-backend.o
+BUILTIN_OBJS += builtin/daemon.o
+BUILTIN_OBJS += builtin/imap-send.o
+BUILTIN_OBJS += builtin/fast-import.o
 
 GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
 EXTLIBS =
@@ -1244,10 +1245,9 @@
 EXTLIBS += -lz
 
 ifndef NO_POSIX_ONLY_PROGRAMS
-	PROGRAM_OBJS += daemon.o
 endif
 ifndef NO_OPENSSL
-	OPENSSL_LIBSSL = -lssl
+	EXTLIBS += -lssl
 	ifdef OPENSSLDIR
 		BASIC_CFLAGS += -I$(OPENSSLDIR)/include
 		OPENSSL_LINK = -L$(OPENSSLDIR)/$(lib) $(CC_LD_DYNPATH)$(OPENSSLDIR)/$(lib)
@@ -1919,10 +1919,6 @@
 git-%$X: %.o $(GITLIBS)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
 
-git-imap-send$X: imap-send.o $(GITLIBS)
-	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
-		$(LIBS) $(OPENSSL_LINK) $(OPENSSL_LIBSSL)
-
 git-http-fetch$X: revision.o http.o http-walker.o http-fetch.o $(GITLIBS)
 	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) \
 		$(LIBS) $(CURL_LIBCURL)
@@ -2120,23 +2116,22 @@
 
 	bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \
 	execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \
+	ln -s ../../bin/git "$$execdir/git" && \
 	{ test "$$bindir/" = "$$execdir/" || \
-	  for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
+	  for p in $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \
 		$(RM) "$$execdir/$$p" && \
 		test -z "$(NO_CROSS_DIRECTORY_HARDLINKS)" && \
-		ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \
+		ln -s git "$$execdir/$$p" 2>/dev/null || \
 		cp "$$bindir/$$p" "$$execdir/$$p" || exit; \
 	  done; \
 	} && \
 	for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \
 		$(RM) "$$bindir/$$p" && \
-		ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \
 		ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \
 		cp "$$bindir/git$X" "$$bindir/$$p" || exit; \
 	done && \
 	for p in $(BUILT_INS); do \
 		$(RM) "$$execdir/$$p" && \
-		ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \
 		ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \
 		cp "$$execdir/git$X" "$$execdir/$$p" || exit; \
 	done && \
diff -Nur git-1.7.3.2-orig/shell.c git-1.7.3.2/shell.c
--- git-1.7.3.2-orig/shell.c	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/shell.c	2010-11-17 12:30:47.981921001 +0100
@@ -45,7 +45,7 @@
 	{ NULL },
 };
 
-int main(int argc, char **argv)
+int cmd_shell(int argc, char **argv, const char *prefix)
 {
 	char *prog;
 	struct commands *cmd;
diff -Nur git-1.7.3.2-orig/upload-pack.c git-1.7.3.2/upload-pack.c
--- git-1.7.3.2-orig/upload-pack.c	2010-10-22 05:49:16.000000000 +0200
+++ git-1.7.3.2/upload-pack.c	2010-11-17 12:30:47.981921001 +0100
@@ -676,7 +676,7 @@
 	}
 }
 
-int main(int argc, char **argv)
+int cmd_upload_pack(int argc, char **argv, const char *prefix)
 {
 	char *dir;
 	int i;