diff options
-rw-r--r-- | extra/gcc-uClibc/gcc-uClibc.c | 866 |
1 files changed, 433 insertions, 433 deletions
diff --git a/extra/gcc-uClibc/gcc-uClibc.c b/extra/gcc-uClibc/gcc-uClibc.c index ca9afa21b..c2971f3af 100644 --- a/extra/gcc-uClibc/gcc-uClibc.c +++ b/extra/gcc-uClibc/gcc-uClibc.c @@ -97,540 +97,540 @@ static char nostdinc_plus[] = "-nostdinc++"; * 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'; - - 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) { + m = 0; + libraries = __builtin_alloca(sizeof(char*) * (argc)); + libraries[m] = '\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) { #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; - - 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'; - } + 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'; + } #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; - - 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 { + 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 { 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; - - for ( j = 1 ; j < argc ; j++ ) { - if (argv[j]=='\0') { - continue; - } else { - gcc_argument[k++] = argv[j]; - gcc_argument[k] = '\0'; + 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'; + } } - } - 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); } |