📄 gcc-uclibc.c
字号:
case 'l': /* library */ libraries[m++] = argv[i]; libraries[m] = NULL; argv[i] = NULL; break; case 'x': /* Set target language */ minusx = 1; i++; 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;#endif use_start = 0; } else if (strcmp(nodefaultlibs, argv[i]) == 0) { use_stdlib = 0; argv[i] = NULL; } else if (strcmp(nostdlib, argv[i]) == 0) {#ifdef __UCLIBC_CTOR_DTOR__ ctor_dtor = 0;#endif use_start = 0; use_stdlib = 0; } #ifdef __UCLIBC_CTOR_DTOR__ else if (strcmp(nostdinc_plus, argv[i]) == 0) { if (cplusplus) { 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) != NULL) { use_static_linking = 1; } if (strstr(argv[i], "--dynamic-linker") != NULL) { dlstr = NULL; } } break;#ifdef __UCLIBC_PROFILING__ 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; } #ifdef __UCLIBC_PROFILING__ 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] = NULL; } else if (strcmp("--uclibc-use-build-dir", argv[i]) == 0) { use_build_dir = 1; argv[i] = NULL; } else if (strcmp("--uclibc-use-rpath", argv[i]) == 0) { use_rpath = 1; argv[i] = NULL; } else if (strcmp ("--uclibc-cc", argv[i]) == 0 && argv[i + 1]) { cc = argv[i + 1]; argv[i++] = NULL; argv[i] = NULL; } else if (strncmp ("--uclibc-cc=", argv[i], 12) == 0) { cc = argv[i] + 12; argv[i] = NULL; }#ifdef __UCLIBC_CTOR_DTOR__ else if (strcmp("--uclibc-no-ctors",argv[i]) == 0) { ctor_dtor = 0; argv[i] = NULL; }#endif break; } } else if (argv[i][0] == '-' && argv[i][1] == '\0') { /* Reading code from stdin - crazy eh? */ ++source_count; } 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)); i = 0; k = 0;#ifdef __UCLIBC_CTOR_DTOR__ if (ctor_dtor) { struct stat statbuf; if (findlibgcc || stat(LIBGCC_DIR, &statbuf) < 0 || !S_ISDIR(statbuf.st_mode)) { /* Bummer, gcc is hiding from us. This is going * to really slow things down... bummer. */ 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[1] = "-print-libgcc-file-name"; argv[2] = NULL; execvp(cc, argv); close(gcc_pipe[1]); _exit(EXIT_FAILURE); } wpid = 0; while (wpid != pid) { wpid = wait(&status); } close(gcc_pipe[1]); if (WIFEXITED(status) && WEXITSTATUS(status)) {crash_n_burn: fprintf(stderr, "Unable to locale crtbegin.o provided by gcc"); exit(EXIT_FAILURE); } if (WIFSIGNALED(status)) { fprintf(stderr, "%s exited because of uncaught signal %d", cc, WTERMSIG(status)); exit(EXIT_FAILURE); } { char buf[1024], *dir; status = read(gcc_pipe[0], buf, sizeof(buf)); close(gcc_pipe[0]); 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 { 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 && cpp) gcc_argv[i++] = cpp; else#endif gcc_argv[i++] = cc; for ( j = 1 ; j < argc ; j++ ) { if (argv[j] != NULL) { gcc_argument[k++] = argv[j]; } } gcc_argument[k] = NULL; if (linking && source_count) {#if defined __HAVE_ELF__ && ! defined __UCLIBC_HAS_MMU__ 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; } } 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; }#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; } if (linking && source_count) {#ifdef __UCLIBC_PROFILING__ 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]; } }#endif if (use_start) {#ifdef __UCLIBC_PROFILING__ 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) {#ifdef __UCLIBC_CTOR_DTOR__ 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"; }#ifdef __UCLIBC_CTOR_DTOR__ if (ctor_dtor) { if (minusx) { gcc_argv[i++] = "-x"; gcc_argv[i++] = "none"; } if (use_pic) { gcc_argv[i++] = crtend_path[1]; } else { gcc_argv[i++] = crtend_path[0]; } 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]; } } gcc_argv[i++] = NULL; if (verbose) { for ( j = 0 ; gcc_argv[j] ; j++ ) { printf("arg[%2i] = %s\n", j, gcc_argv[j]); } fflush(stdout); } //no need to free memory from xstrcat because we never return... #ifdef __UCLIBC_CTOR_DTOR__ if (cplusplus && cpp) { execvp(cpp, gcc_argv); fprintf(stderr, "%s: %s\n", cpp, strerror(errno)); } else#endif { execvp(cc, gcc_argv); fprintf(stderr, "%s: %s\n", cc, strerror(errno)); } exit(EXIT_FAILURE);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -