[uClibc-cvs] uClibc/extra/gcc-uClibc gcc-uClibc.c,1.59,1.60

Erik Andersen andersen at uclibc.org
Tue Jun 24 08:23:22 UTC 2003


Update of /var/cvs/uClibc/extra/gcc-uClibc
In directory winder:/tmp/cvs-serv22090

Modified Files:
	gcc-uClibc.c 
Log Message:
Fix indenting for real this time.


Index: gcc-uClibc.c
===================================================================
RCS file: /var/cvs/uClibc/extra/gcc-uClibc/gcc-uClibc.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -d -r1.59 -r1.60
--- gcc-uClibc.c	24 Jun 2003 08:19:35 -0000	1.59
+++ gcc-uClibc.c	24 Jun 2003 08:23:19 -0000	1.60
@@ -97,540 +97,540 @@
  * doesn't provide an implementation of basename(). */
 char *basename(const char *path)
 {
-    register const char *s;
-    register const char *p;
-    p = s = path;
-    while (*s) {
-	if (*s++ == '/') {
-	    p = s;
+	register const char *s;
+	register const char *p;
+	p = s = path;
+	while (*s) {
+		if (*s++ == '/') {
+			p = s;
+		}
 	}
-    }
-    return (char *) p;
+	return (char *) p;
 }
 
 char *dirname(char *path)
 {
-    static const char null_or_empty_or_noslash[] = ".";
-    register char *s;
-    register char *last;
-    char *first;
+	static const char null_or_empty_or_noslash[] = ".";
+	register char *s;
+	register char *last;
+	char *first;
 
-    last = s = path;
+	last = s = path;
 
-    if (s != NULL) {
+	if (s != NULL) {
 
 LOOP:
-	while (*s && (*s != '/')) ++s;
-	first = s;
-	while (*s == '/') ++s;
-	if (*s) {
-	    last = first;
-	    goto LOOP;
-	}
+		while (*s && (*s != '/')) ++s;
+		first = s;
+		while (*s == '/') ++s;
+		if (*s) {
+			last = first;
+			goto LOOP;
+		}
 
-	if (last == path) {
-	    if (*last != '/') {
-		goto DOT;
-	    }
-	    if ((*++last == '/') && (last[1] == 0)) {
-		++last;
-	    }
+		if (last == path) {
+			if (*last != '/') {
+				goto DOT;
+			}
+			if ((*++last == '/') && (last[1] == 0)) {
+				++last;
+			}
+		}
+		*last = 0;
+		return path;
 	}
-	*last = 0;
-	return path;
-    }
 DOT:
-    return (char *) null_or_empty_or_noslash;
+	return (char *) null_or_empty_or_noslash;
 }
 
 
 extern void *xmalloc(size_t size)
 {
-    void *ptr = malloc(size);
+	void *ptr = malloc(size);
 
-    if (!ptr) {
-	fprintf(stderr, "memory exhausted");
-	exit(EXIT_FAILURE);
-    }
-    return ptr;
+	if (!ptr) {
+		fprintf(stderr, "memory exhausted");
+		exit(EXIT_FAILURE);
+	}
+	return ptr;
 }
 
 void xstrcat(char **string, ...)
 {
-    const char *c;
-    va_list p; 
-    /* Don't bother to calculate how big exerything 
-     * will be, just be careful to not overflow...  */
-    va_start(p, string);
-    *string = xmalloc(BUFSIZ);
-    **string = '\0';
-    while(1) {
-	if (!(c = va_arg(p, const char *)))
-	    break;
-	strcat(*string, c); 
-    }
-    va_end(p);
+	const char *c;
+	va_list p; 
+	/* Don't bother to calculate how big exerything 
+	 * will be, just be careful to not overflow...  */
+	va_start(p, string);
+	*string = xmalloc(BUFSIZ);
+	**string = '\0';
+	while(1) {
+		if (!(c = va_arg(p, const char *)))
+			break;
+		strcat(*string, c); 
+	}
+	va_end(p);
 }
 
 int main(int argc, char **argv)
 {
-    int use_build_dir = 0, linking = 1, use_static_linking = 0;
-    int use_stdinc = 1, use_start = 1, use_stdlib = 1, use_pic = 0;
-    int source_count = 0, use_rpath = 0, verbose = 0;
-    int i, j, k, l, m, n;
-    char ** gcc_argv;
-    char ** gcc_argument;
-    char ** libraries;
-    char ** libpath;
-    char *dlstr;
-    char *incstr;
-    char *devprefix;
-    char *builddir;
-    char *libstr;
-    char *build_dlstr = 0;
-    char *cc;
-    char *ep;
-    char *rpath_link[2];
-    char *rpath[2];
-    char *uClibc_inc[2];
-    char *our_lib_path[2];
-    char *crt0_path[2];
-    char *crtbegin_path[2];
-    char *crtend_path[2];
-    const char *application_name;
+	int use_build_dir = 0, linking = 1, use_static_linking = 0;
+	int use_stdinc = 1, use_start = 1, use_stdlib = 1, use_pic = 0;
+	int source_count = 0, use_rpath = 0, verbose = 0;
+	int i, j, k, l, m, n;
+	char ** gcc_argv;
+	char ** gcc_argument;
+	char ** libraries;
+	char ** libpath;
+	char *dlstr;
+	char *incstr;
+	char *devprefix;
+	char *builddir;
+	char *libstr;
+	char *build_dlstr = 0;
+	char *cc;
+	char *ep;
+	char *rpath_link[2];
+	char *rpath[2];
+	char *uClibc_inc[2];
+	char *our_lib_path[2];
+	char *crt0_path[2];
+	char *crtbegin_path[2];
+	char *crtend_path[2];
+	const char *application_name;
 #ifdef __UCLIBC_CTOR_DTOR__
-    char *crti_path[2];
-    char *crtn_path[2];
-    int len;
-    int ctor_dtor = 1, cplusplus = 0, use_nostdinc_plus = 0;
-    char *GPLUSPLUS_BIN = NULL;
+	char *crti_path[2];
+	char *crtn_path[2];
+	int len;
+	int ctor_dtor = 1, cplusplus = 0, use_nostdinc_plus = 0;
+	char *GPLUSPLUS_BIN = NULL;
 #endif
 #ifdef __UCLIBC_PROFILING__
-    int profile = 0;
-    char *gcrt1_path[2];
+	int profile = 0;
+	char *gcrt1_path[2];
 #endif
 
-    cc     = getenv("UCLIBC_CC");
-    if (!cc) {
-	cc = GCC_BIN;
-    }
+	cc     = getenv("UCLIBC_CC");
+	if (!cc) {
+		cc = GCC_BIN;
+	}
 
-    application_name = basename(argv[0]);
-    if (application_name[0] == '-')
-	application_name++;
+	application_name = basename(argv[0]);
+	if (application_name[0] == '-')
+		application_name++;
 
 #ifdef __UCLIBC_CTOR_DTOR__
-    /* We must use strstr since g++ might be named like a
-     * cross compiler (i.e. arm-linux-g++).   We must also
-     * search carefully, in case we are searching something 
-     * like /opt/c++/gcc-3.1/bin/arm-linux-g++ or some similar 
-     * perversion...  */
-    len = strlen(application_name);
-    if ((strcmp(application_name+len-3, "g++")==0) ||
-	    (strcmp(application_name+len-3, "c++")==0)) {
-	len = strlen(cc);
-	if (strcmp(cc+len-3, "gcc")==0) {
-	    GPLUSPLUS_BIN = strdup(cc);
-	    GPLUSPLUS_BIN[len-1]='+';
-	    GPLUSPLUS_BIN[len-2]='+';
+	/* We must use strstr since g++ might be named like a
+	 * cross compiler (i.e. arm-linux-g++).   We must also
+	 * search carefully, in case we are searching something 
+	 * like /opt/c++/gcc-3.1/bin/arm-linux-g++ or some similar 
+	 * perversion...  */
+	len = strlen(application_name);
+	if ((strcmp(application_name+len-3, "g++")==0) ||
+			(strcmp(application_name+len-3, "c++")==0)) {
+		len = strlen(cc);
+		if (strcmp(cc+len-3, "gcc")==0) {
+			GPLUSPLUS_BIN = strdup(cc);
+			GPLUSPLUS_BIN[len-1]='+';
+			GPLUSPLUS_BIN[len-2]='+';
+		}
+		cplusplus = 1;
+		use_nostdinc_plus = 1;
 	}
-	cplusplus = 1;
-	use_nostdinc_plus = 1;
-    }
 #endif
 
-    devprefix = getenv("UCLIBC_DEVEL_PREFIX");
-    if (!devprefix) {
-	devprefix = UCLIBC_DEVEL_PREFIX;
-    }
+	devprefix = getenv("UCLIBC_DEVEL_PREFIX");
+	if (!devprefix) {
+		devprefix = UCLIBC_DEVEL_PREFIX;
+	}
 
-    builddir = getenv("UCLIBC_BUILD_DIR");
-    if (!builddir) {
-	builddir = UCLIBC_BUILD_DIR;
-    }
+	builddir = getenv("UCLIBC_BUILD_DIR");
+	if (!builddir) {
+		builddir = UCLIBC_BUILD_DIR;
+	}
 
-    incstr = getenv("UCLIBC_GCC_INC");
-    libstr = getenv("UCLIBC_GCC_LIB");
+	incstr = getenv("UCLIBC_GCC_INC");
+	libstr = getenv("UCLIBC_GCC_LIB");
 
-    ep     = getenv("UCLIBC_ENV");
-    if (!ep) {
-	ep = "";
-    }
+	ep     = getenv("UCLIBC_ENV");
+	if (!ep) {
+		ep = "";
+	}
 
-    if (strstr(ep,"build") != 0) {
-	use_build_dir = 1;
-    }
+	if (strstr(ep,"build") != 0) {
+		use_build_dir = 1;
+	}
 
-    if (strstr(ep,"rpath") != 0) {
-	use_rpath = 1;
-    }
+	if (strstr(ep,"rpath") != 0) {
+		use_rpath = 1;
+	}
 
 
-    xstrcat(&(rpath_link[0]), "-Wl,-rpath-link,", devprefix, "/lib", NULL);
-    xstrcat(&(rpath_link[1]), "-Wl,-rpath-link,", builddir, "/lib", NULL);
+	xstrcat(&(rpath_link[0]), "-Wl,-rpath-link,", devprefix, "/lib", NULL);
+	xstrcat(&(rpath_link[1]), "-Wl,-rpath-link,", builddir, "/lib", NULL);
 
-    xstrcat(&(rpath[0]), "-Wl,-rpath,", devprefix, "/lib", NULL);
-    xstrcat(&(rpath[1]), "-Wl,-rpath,", builddir, "/lib", NULL);
+	xstrcat(&(rpath[0]), "-Wl,-rpath,", devprefix, "/lib", NULL);
+	xstrcat(&(rpath[1]), "-Wl,-rpath,", builddir, "/lib", NULL);
 
-    xstrcat(&(uClibc_inc[0]), devprefix, "/include/", NULL);
-    xstrcat(&(uClibc_inc[1]), builddir, "/include/", NULL);
+	xstrcat(&(uClibc_inc[0]), devprefix, "/include/", NULL);
+	xstrcat(&(uClibc_inc[1]), builddir, "/include/", NULL);
 
 #ifdef __UCLIBC_CTOR_DTOR__
-    xstrcat(&(crt0_path[0]), devprefix, "/lib/crt1.o", NULL);
-    xstrcat(&(crt0_path[1]), builddir, "/lib/crt1.o", NULL);
-    xstrcat(&(crti_path[0]), devprefix, "/lib/crti.o", NULL);
-    xstrcat(&(crti_path[1]), builddir, "/lib/crti.o", NULL);
-    xstrcat(&(crtn_path[0]), devprefix, "/lib/crtn.o", NULL);
-    xstrcat(&(crtn_path[1]), builddir, "/lib/crtn.o", NULL);
+	xstrcat(&(crt0_path[0]), devprefix, "/lib/crt1.o", NULL);
+	xstrcat(&(crt0_path[1]), builddir, "/lib/crt1.o", NULL);
+	xstrcat(&(crti_path[0]), devprefix, "/lib/crti.o", NULL);
+	xstrcat(&(crti_path[1]), builddir, "/lib/crti.o", NULL);
+	xstrcat(&(crtn_path[0]), devprefix, "/lib/crtn.o", NULL);
+	xstrcat(&(crtn_path[1]), builddir, "/lib/crtn.o", NULL);
 #else
-    xstrcat(&(crt0_path[0]), devprefix, "/lib/crt0.o", NULL);
-    xstrcat(&(crt0_path[1]), builddir, "/lib/crt0.o", NULL);
+	xstrcat(&(crt0_path[0]), devprefix, "/lib/crt0.o", NULL);
+	xstrcat(&(crt0_path[1]), builddir, "/lib/crt0.o", NULL);
 #endif
 #ifdef __UCLIBC_PROFILING__
-    xstrcat(&(gcrt1_path[0]), devprefix, "/lib/gcrt1.o", NULL);
-    xstrcat(&(gcrt1_path[1]), builddir, "/lib/gcrt1.o", NULL);
+	xstrcat(&(gcrt1_path[0]), devprefix, "/lib/gcrt1.o", NULL);
+	xstrcat(&(gcrt1_path[1]), builddir, "/lib/gcrt1.o", NULL);
 #endif
 
-    xstrcat(&(our_lib_path[0]), "-L", devprefix, "/lib", NULL);
-    xstrcat(&(our_lib_path[1]), "-L", builddir, "/lib", NULL);
+	xstrcat(&(our_lib_path[0]), "-L", devprefix, "/lib", NULL);
+	xstrcat(&(our_lib_path[1]), "-L", builddir, "/lib", NULL);
 
 #ifdef __UCLIBC_HAS_SHARED__
-    build_dlstr = "-Wl,--dynamic-linker," BUILD_DYNAMIC_LINKER;
-    dlstr = getenv("UCLIBC_GCC_DLOPT");
-    if (!dlstr) {
-	dlstr = "-Wl,--dynamic-linker," DYNAMIC_LINKER;
-    }
+	build_dlstr = "-Wl,--dynamic-linker," BUILD_DYNAMIC_LINKER;
+	dlstr = getenv("UCLIBC_GCC_DLOPT");
+	if (!dlstr) {
+		dlstr = "-Wl,--dynamic-linker," DYNAMIC_LINKER;
+	}
 #endif
 
-    m = 0;
-    libraries = __builtin_alloca(sizeof(char*) * (argc));
-    libraries[m] = '\0';
+	m = 0;
+	libraries = __builtin_alloca(sizeof(char*) * (argc));
+	libraries[m] = '\0';
 
-    n = 0;
-    libpath = __builtin_alloca(sizeof(char*) * (argc));
-    libpath[n] = '\0';
+	n = 0;
+	libpath = __builtin_alloca(sizeof(char*) * (argc));
+	libpath[n] = '\0';
 
-    for ( i = 1 ; i < argc ; i++ ) {
-	if (argv[i][0] == '-') { /* option */
-	    switch (argv[i][1]) {
-		case 'c':		/* compile or assemble */
-		case 'S':		/* generate assembler code */
-		case 'E':		/* preprocess only */
-		case 'M':	    /* generate dependencies */
-		    linking = 0;
-		    break;
-		case 'L': 		/* library */
-		    libpath[n++] = argv[i];
-		    libpath[n] = '\0';
-		    if (argv[i][2] == 0) {
-			argv[i] = '\0';
-			libpath[n++] = argv[++i];
-			libpath[n] = '\0';
-		    }
-		    argv[i] = '\0';
-		    break;
-		case 'l': 		/* library */
-		    libraries[m++] = argv[i];
-		    libraries[m] = '\0';
-		    argv[i] = '\0';
-		    break;
-		case 'v':		/* verbose */
-		    if (argv[i][2] == 0) verbose = 1;
-		    printf("Invoked as %s\n", argv[0]);
-		    break;
-		case 'n':
-		    if (strcmp(nostdinc,argv[i]) == 0) {
-			use_stdinc = 0;
-		    } else if (strcmp(nostartfiles,argv[i]) == 0) {
+	for ( i = 1 ; i < argc ; i++ ) {
+		if (argv[i][0] == '-') { /* option */
+			switch (argv[i][1]) {
+				case 'c':		/* compile or assemble */
+				case 'S':		/* generate assembler code */
+				case 'E':		/* preprocess only */
+				case 'M':	    /* generate dependencies */
+					linking = 0;
+					break;
+				case 'L': 		/* library */
+					libpath[n++] = argv[i];
+					libpath[n] = '\0';
+					if (argv[i][2] == 0) {
+						argv[i] = '\0';
+						libpath[n++] = argv[++i];
+						libpath[n] = '\0';
+					}
+					argv[i] = '\0';
+					break;
+				case 'l': 		/* library */
+					libraries[m++] = argv[i];
+					libraries[m] = '\0';
+					argv[i] = '\0';
+					break;
+				case 'v':		/* verbose */
+					if (argv[i][2] == 0) verbose = 1;
+					printf("Invoked as %s\n", argv[0]);
+					break;
+				case 'n':
+					if (strcmp(nostdinc,argv[i]) == 0) {
+						use_stdinc = 0;
+					} else if (strcmp(nostartfiles,argv[i]) == 0) {
 #ifdef __UCLIBC_CTOR_DTOR__
-			ctor_dtor = 0;
+						ctor_dtor = 0;
 #endif
-			use_start = 0;
-		    } else if (strcmp(nodefaultlibs,argv[i]) == 0) {
-			use_stdlib = 0;
-			argv[i] = '\0';
-		    } else if (strcmp(nostdlib,argv[i]) == 0) {
+						use_start = 0;
+					} else if (strcmp(nodefaultlibs,argv[i]) == 0) {
+						use_stdlib = 0;
+						argv[i] = '\0';
+					} else if (strcmp(nostdlib,argv[i]) == 0) {
 #ifdef __UCLIBC_CTOR_DTOR__
-			ctor_dtor = 0;
+						ctor_dtor = 0;
 #endif
-			use_start = 0;
-			use_stdlib = 0;
-		    } 
+						use_start = 0;
+						use_stdlib = 0;
+					} 
 #ifdef __UCLIBC_CTOR_DTOR__
-		    else if (strcmp(nostdinc_plus,argv[i]) == 0) {
-			if (cplusplus==1) {
-			    use_nostdinc_plus = 0;
-			}
-		    }
+					else if (strcmp(nostdinc_plus,argv[i]) == 0) {
+						if (cplusplus==1) {
+							use_nostdinc_plus = 0;
+						}
+					}
 #endif
-		    break;
-		case 's':
-		    if (strstr(argv[i],static_linking) != NULL) {
-			use_static_linking = 1;
-		    }
-		    if (strcmp("-shared",argv[i]) == 0) {
-			use_start = 0;
-			use_pic = 1;
-		    }
-		    break;
-		case 'W':		/* -static could be passed directly to ld */
-		    if (strncmp("-Wl,",argv[i],4) == 0) {
-			if (strstr(argv[i],static_linking) != 0) {
-			    use_static_linking = 1;
-			}
-			if (strstr(argv[i],"--dynamic-linker") != 0) {
-			    dlstr = 0;
-			}
-		    }
-		    break;
+					break;
+				case 's':
+					if (strstr(argv[i],static_linking) != NULL) {
+						use_static_linking = 1;
+					}
+					if (strcmp("-shared",argv[i]) == 0) {
+						use_start = 0;
+						use_pic = 1;
+					}
+					break;
+				case 'W':		/* -static could be passed directly to ld */
+					if (strncmp("-Wl,",argv[i],4) == 0) {
+						if (strstr(argv[i],static_linking) != 0) {
+							use_static_linking = 1;
+						}
+						if (strstr(argv[i],"--dynamic-linker") != 0) {
+							dlstr = 0;
+						}
+					}
+					break;
 #ifdef __UCLIBC_PROFILING__
-		case 'p':
-		    if (strcmp("-pg",argv[i]) == 0) {
-			profile = 1;
-		    }
-		    break;
+				case 'p':
+					if (strcmp("-pg",argv[i]) == 0) {
+						profile = 1;
+					}
+					break;
 #endif
-		case 'f':
-		    /* Check if we are doing PIC */
-		    if (strcmp("-fPIC",argv[i]) == 0) {
-			use_pic = 1;
-		    } else if (strcmp("-fpic",argv[i]) == 0) {
-			use_pic = 1;
-		    } 
+				case 'f':
+					/* Check if we are doing PIC */
+					if (strcmp("-fPIC",argv[i]) == 0) {
+						use_pic = 1;
+					} else if (strcmp("-fpic",argv[i]) == 0) {
+						use_pic = 1;
+					} 
 #ifdef __UCLIBC_PROFILING__
-		    else if (strcmp("-fprofile-arcs",argv[i]) == 0) {
-			profile = 1;
-		    }
+					else if (strcmp("-fprofile-arcs",argv[i]) == 0) {
+						profile = 1;
+					}
 #endif
-		    break;
+					break;
 
-		case '-':
-		    if (strstr(argv[i]+1,static_linking) != NULL) {
-			use_static_linking = 1;
-			argv[i]='\0';
-		    } else if (strcmp("--uclibc-use-build-dir",argv[i]) == 0) {
-			use_build_dir = 1;
-			argv[i]='\0';
-		    } else if (strcmp("--uclibc-use-rpath",argv[i]) == 0) {
-			use_rpath = 1;
-			argv[i]='\0';
-		    }
+				case '-':
+					if (strstr(argv[i]+1,static_linking) != NULL) {
+						use_static_linking = 1;
+						argv[i]='\0';
+					} else if (strcmp("--uclibc-use-build-dir",argv[i]) == 0) {
+						use_build_dir = 1;
+						argv[i]='\0';
+					} else if (strcmp("--uclibc-use-rpath",argv[i]) == 0) {
+						use_rpath = 1;
+						argv[i]='\0';
+					}
 #ifdef __UCLIBC_CTOR_DTOR__
-		    else if (strcmp("--uclibc-no-ctors",argv[i]) == 0) {
-			ctor_dtor = 0;
-			argv[i]='\0';
-		    }
+					else if (strcmp("--uclibc-no-ctors",argv[i]) == 0) {
+						ctor_dtor = 0;
+						argv[i]='\0';
+					}
 #endif
-		    break;
-	    }
-	} else {				/* assume it is an existing source file */
-	    ++source_count;
+					break;
+			}
+		} else {				/* assume it is an existing source file */
+			++source_count;
+		}
 	}
-    }
 
-    gcc_argv = __builtin_alloca(sizeof(char*) * (argc + 64));
-    gcc_argument = __builtin_alloca(sizeof(char*) * (argc + 20));
+	gcc_argv = __builtin_alloca(sizeof(char*) * (argc + 64));
+	gcc_argument = __builtin_alloca(sizeof(char*) * (argc + 20));
 
-    i = 0; k = 0;
+	i = 0; k = 0;
 #ifdef __UCLIBC_CTOR_DTOR__
-    if (ctor_dtor) {
-	struct stat statbuf;
-	if (stat(LIBGCC_DIR, &statbuf)!=0 || 
-		!S_ISDIR(statbuf.st_mode))
-	{
-	    /* Bummer, gcc has moved things on us... */
-	    int status, gcc_pipe[2];
-	    pid_t pid, wpid;
+	if (ctor_dtor) {
+		struct stat statbuf;
+		if (stat(LIBGCC_DIR, &statbuf)!=0 || 
+				!S_ISDIR(statbuf.st_mode))
+		{
+			/* Bummer, gcc has moved things on us... */
+			int status, gcc_pipe[2];
+			pid_t pid, wpid;
 
-	    pipe(gcc_pipe);
-	    if (!(pid = fork())) {
-		char *argv[4];
-		close(gcc_pipe[0]);
-		close(1);
-		close(2);
-		dup2(gcc_pipe[1], 1);
-		dup2(gcc_pipe[1], 2);
-		argv[0] = cc; 
-		argv[2] = "-print-libgcc-file-name";
-		argv[3] = NULL;
-		execvp(argv[0], argv);
-		close(gcc_pipe[1]);
-		_exit(-1);
-	    }
-	    wpid=0;
-	    while (wpid != pid) {
-		wpid = wait(&status);
-	    }
-	    close(gcc_pipe[1]);
-	    if (WIFEXITED(status)) {
-		char buf[1024], *dir;
-		status = read(gcc_pipe[0], buf, sizeof(buf));
-		if (status < 0) {
-		    goto crash_n_burn;
-		}
-		dir = dirname(buf);
-		xstrcat(&(crtbegin_path[0]), dir, "crtbegin.o", NULL);
-		xstrcat(&(crtbegin_path[1]), dir, "crtbeginS.o", NULL);
-		xstrcat(&(crtend_path[0]), dir, "crtend.o", NULL);
-		xstrcat(&(crtend_path[1]), dir, "crtendS.o", NULL);
-	    } else {
+			pipe(gcc_pipe);
+			if (!(pid = fork())) {
+				char *argv[4];
+				close(gcc_pipe[0]);
+				close(1);
+				close(2);
+				dup2(gcc_pipe[1], 1);
+				dup2(gcc_pipe[1], 2);
+				argv[0] = cc; 
+				argv[2] = "-print-libgcc-file-name";
+				argv[3] = NULL;
+				execvp(argv[0], argv);
+				close(gcc_pipe[1]);
+				_exit(-1);
+			}
+			wpid=0;
+			while (wpid != pid) {
+				wpid = wait(&status);
+			}
+			close(gcc_pipe[1]);
+			if (WIFEXITED(status)) {
+				char buf[1024], *dir;
+				status = read(gcc_pipe[0], buf, sizeof(buf));
+				if (status < 0) {
+					goto crash_n_burn;
+				}
+				dir = dirname(buf);
+				xstrcat(&(crtbegin_path[0]), dir, "crtbegin.o", NULL);
+				xstrcat(&(crtbegin_path[1]), dir, "crtbeginS.o", NULL);
+				xstrcat(&(crtend_path[0]), dir, "crtend.o", NULL);
+				xstrcat(&(crtend_path[1]), dir, "crtendS.o", NULL);
+			} else {
 crash_n_burn:
-		fprintf(stderr, "Unable to locale crtbegin.o provided by gcc");
-		exit(EXIT_FAILURE);
-	    }
-	    close(gcc_pipe[0]);
+				fprintf(stderr, "Unable to locale crtbegin.o provided by gcc");
+				exit(EXIT_FAILURE);
+			}
+			close(gcc_pipe[0]);
 
-	} else {
-	    xstrcat(&(crtbegin_path[0]), LIBGCC_DIR, "crtbegin.o", NULL);
-	    xstrcat(&(crtbegin_path[1]), LIBGCC_DIR, "crtbeginS.o", NULL);
-	    xstrcat(&(crtend_path[0]), LIBGCC_DIR, "crtend.o", NULL);
-	    xstrcat(&(crtend_path[1]), LIBGCC_DIR, "crtendS.o", NULL);
+		} else {
+			xstrcat(&(crtbegin_path[0]), LIBGCC_DIR, "crtbegin.o", NULL);
+			xstrcat(&(crtbegin_path[1]), LIBGCC_DIR, "crtbeginS.o", NULL);
+			xstrcat(&(crtend_path[0]), LIBGCC_DIR, "crtend.o", NULL);
+			xstrcat(&(crtend_path[1]), LIBGCC_DIR, "crtendS.o", NULL);
+		}
 	}
-    }
 
-    if (cplusplus && GPLUSPLUS_BIN)
-	gcc_argv[i++] = GPLUSPLUS_BIN;
-    else
+	if (cplusplus && GPLUSPLUS_BIN)
+		gcc_argv[i++] = GPLUSPLUS_BIN;
+	else
 #endif
-	gcc_argv[i++] = cc;
+		gcc_argv[i++] = cc;
 
-    for ( j = 1 ; j < argc ; j++ ) {
-	if (argv[j]=='\0') {
-	    continue;
-	} else {
-	    gcc_argument[k++] = argv[j];
-	    gcc_argument[k] = '\0';
+	for ( j = 1 ; j < argc ; j++ ) {
+		if (argv[j]=='\0') {
+			continue;
+		} else {
+			gcc_argument[k++] = argv[j];
+			gcc_argument[k] = '\0';
+		}
 	}
-    }
 
-    if (linking && source_count) {
+	if (linking && source_count) {
 #if defined __HAVE_ELF__ && ! defined __UCLIBC_HAS_MMU__
-	gcc_argv[i++] = "-Wl,-elf2flt";
+		gcc_argv[i++] = "-Wl,-elf2flt";
 #endif
-	gcc_argv[i++] = nostdlib;
-	if (use_static_linking) {
-	    gcc_argv[i++] = static_linking;
-	}
-	if (!use_static_linking) {
-	    if (dlstr && use_build_dir) {
-		gcc_argv[i++] = build_dlstr;
-	    } else if (dlstr) {
-		gcc_argv[i++] = dlstr;
-	    }
-	    if (use_rpath) {
-		gcc_argv[i++] = rpath[use_build_dir];
-	    }
-	}
-	for ( l = 0 ; l < n ; l++ ) {
-	    if (libpath[l]) gcc_argv[i++] = libpath[l];
-	}
-	gcc_argv[i++] = rpath_link[use_build_dir]; /* just to be safe */
-	if( libstr )
-	    gcc_argv[i++] = libstr;
-	gcc_argv[i++] = our_lib_path[use_build_dir];
-	if (!use_build_dir) {
-	    gcc_argv[i++] = our_usr_lib_path;
+		gcc_argv[i++] = nostdlib;
+		if (use_static_linking) {
+			gcc_argv[i++] = static_linking;
+		}
+		if (!use_static_linking) {
+			if (dlstr && use_build_dir) {
+				gcc_argv[i++] = build_dlstr;
+			} else if (dlstr) {
+				gcc_argv[i++] = dlstr;
+			}
+			if (use_rpath) {
+				gcc_argv[i++] = rpath[use_build_dir];
+			}
+		}
+		for ( l = 0 ; l < n ; l++ ) {
+			if (libpath[l]) gcc_argv[i++] = libpath[l];
+		}
+		gcc_argv[i++] = rpath_link[use_build_dir]; /* just to be safe */
+		if( libstr )
+			gcc_argv[i++] = libstr;
+		gcc_argv[i++] = our_lib_path[use_build_dir];
+		if (!use_build_dir) {
+			gcc_argv[i++] = our_usr_lib_path;
+		}
 	}
-    }
-    if (use_stdinc && source_count) {
-	gcc_argv[i++] = nostdinc;
+	if (use_stdinc && source_count) {
+		gcc_argv[i++] = nostdinc;
 #ifdef __UCLIBC_CTOR_DTOR__
-	if (cplusplus) {
-	    char *cppinc;
-	    if (use_nostdinc_plus) {
-		gcc_argv[i++] = nostdinc_plus;
-	    }
-	    xstrcat(&cppinc, uClibc_inc[use_build_dir], "g++/", NULL);
-	    gcc_argv[i++] = "-isystem";
-	    gcc_argv[i++] = cppinc;
-	    xstrcat(&cppinc, uClibc_inc[use_build_dir], "g++-v3/", NULL);
-	    gcc_argv[i++] = "-isystem";
-	    gcc_argv[i++] = cppinc;
-	}
+		if (cplusplus) {
+			char *cppinc;
+			if (use_nostdinc_plus) {
+				gcc_argv[i++] = nostdinc_plus;
+			}
+			xstrcat(&cppinc, uClibc_inc[use_build_dir], "g++/", NULL);
+			gcc_argv[i++] = "-isystem";
+			gcc_argv[i++] = cppinc;
+			xstrcat(&cppinc, uClibc_inc[use_build_dir], "g++-v3/", NULL);
+			gcc_argv[i++] = "-isystem";
+			gcc_argv[i++] = cppinc;
+		}
 #endif
-	gcc_argv[i++] = "-isystem";
-	gcc_argv[i++] = uClibc_inc[use_build_dir];
-	gcc_argv[i++] = "-iwithprefix";
-	gcc_argv[i++] = "include";
-	if( incstr )
-	    gcc_argv[i++] = incstr;
-    }
+		gcc_argv[i++] = "-isystem";
+		gcc_argv[i++] = uClibc_inc[use_build_dir];
+		gcc_argv[i++] = "-iwithprefix";
+		gcc_argv[i++] = "include";
+		if( incstr )
+			gcc_argv[i++] = incstr;
+	}
 
-    if (linking && source_count) {
+	if (linking && source_count) {
 
 #ifdef __UCLIBC_PROFILING__
-	if (profile) {
-	    gcc_argv[i++] = gcrt1_path[use_build_dir];
-	}
+		if (profile) {
+			gcc_argv[i++] = gcrt1_path[use_build_dir];
+		}
 #endif
 #ifdef __UCLIBC_CTOR_DTOR__
-	if (ctor_dtor) {
-	    gcc_argv[i++] = crti_path[use_build_dir];
-	    if (use_pic) {
-		gcc_argv[i++] = crtbegin_path[1];
-	    } else {
-		gcc_argv[i++] = crtbegin_path[0];
-	    }
-	}
+		if (ctor_dtor) {
+			gcc_argv[i++] = crti_path[use_build_dir];
+			if (use_pic) {
+				gcc_argv[i++] = crtbegin_path[1];
+			} else {
+				gcc_argv[i++] = crtbegin_path[0];
+			}
+		}
 #endif
-	if (use_start) {
+		if (use_start) {
 #ifdef __UCLIBC_PROFILING__
-	    if (!profile)
+			if (!profile)
 #endif
-	    {
-		gcc_argv[i++] = crt0_path[use_build_dir];
-	    }
-	}
-	for ( l = 0 ; l < k ; l++ ) {
-	    if (gcc_argument[l]) gcc_argv[i++] = gcc_argument[l];
-	}
-	if (use_stdlib) {
-	    //gcc_argv[i++] = "-Wl,--start-group";
-	    gcc_argv[i++] = "-lgcc";
-	}
-	for ( l = 0 ; l < m ; l++ ) {
-	    if (libraries[l]) gcc_argv[i++] = libraries[l];
-	}
-	if (use_stdlib) {
+			{
+				gcc_argv[i++] = crt0_path[use_build_dir];
+			}
+		}
+		for ( l = 0 ; l < k ; l++ ) {
+			if (gcc_argument[l]) gcc_argv[i++] = gcc_argument[l];
+		}
+		if (use_stdlib) {
+			//gcc_argv[i++] = "-Wl,--start-group";
+			gcc_argv[i++] = "-lgcc";
+		}
+		for ( l = 0 ; l < m ; l++ ) {
+			if (libraries[l]) gcc_argv[i++] = libraries[l];
+		}
+		if (use_stdlib) {
 #ifdef __UCLIBC_CTOR_DTOR__
-	    if (cplusplus) {
-		gcc_argv[ i++ ] = "-lstdc++";
-		gcc_argv[ i++ ] = "-lm";
-	    }
+			if (cplusplus) {
+				gcc_argv[ i++ ] = "-lstdc++";
+				gcc_argv[ i++ ] = "-lm";
+			}
 #endif
-	    gcc_argv[i++] = "-lc";
-	    gcc_argv[i++] = "-lgcc";
-	    //gcc_argv[i++] = "-Wl,--end-group";
-	}
+			gcc_argv[i++] = "-lc";
+			gcc_argv[i++] = "-lgcc";
+			//gcc_argv[i++] = "-Wl,--end-group";
+		}
 #ifdef __UCLIBC_CTOR_DTOR__
-	if (ctor_dtor) {
-	    if (use_pic) {
-		gcc_argv[i++] = crtend_path[1];
-	    } else {
-		gcc_argv[i++] = crtend_path[0];
-	    }
+		if (ctor_dtor) {
+			if (use_pic) {
+				gcc_argv[i++] = crtend_path[1];
+			} else {
+				gcc_argv[i++] = crtend_path[0];
+			}
 
-	    gcc_argv[i++] = crtn_path[use_build_dir];
-	}
+			gcc_argv[i++] = crtn_path[use_build_dir];
+		}
 #endif
-    } else {
-	for ( l = 0 ; l < k ; l++ ) {
-	    if (gcc_argument[l]) gcc_argv[i++] = gcc_argument[l];
+	} else {
+		for ( l = 0 ; l < k ; l++ ) {
+			if (gcc_argument[l]) gcc_argv[i++] = gcc_argument[l];
+		}
 	}
-    }
-    gcc_argv[i++] = NULL;
+	gcc_argv[i++] = NULL;
 
-    if (verbose) {
-	for ( j = 0 ; gcc_argv[j] ; j++ ) {
-	    printf("arg[%2i] = %s\n", j, gcc_argv[j]);
+	if (verbose) {
+		for ( j = 0 ; gcc_argv[j] ; j++ ) {
+			printf("arg[%2i] = %s\n", j, gcc_argv[j]);
+		}
+		fflush(stdout);
 	}
-	fflush(stdout);
-    }
-    //no need to free memory from xstrcat because we never return... 
+	//no need to free memory from xstrcat because we never return... 
 #ifdef __UCLIBC_CTOR_DTOR__
-    if (cplusplus && GPLUSPLUS_BIN)
-	return execvp(GPLUSPLUS_BIN, gcc_argv);
-    else
+	if (cplusplus && GPLUSPLUS_BIN)
+		return execvp(GPLUSPLUS_BIN, gcc_argv);
+	else
 #endif
-	return execvp(cc, gcc_argv);
+		return execvp(cc, gcc_argv);
 }



More information about the uClibc-cvs mailing list