diff options
author | Eric Andersen <andersen@codepoet.org> | 2002-03-22 07:26:14 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2002-03-22 07:26:14 +0000 |
commit | f07a09b0620792865d473c2dbce914c039d2e20a (patch) | |
tree | 771fa30d0f6830170fca0b45ca5d2d477cb332bc /extra/gcc-uClibc/gcc-uClibc.c | |
parent | 68860fb4a5e8ed053beabaa73691a5f49ddf4086 (diff) |
Fix incorrect ordering of -L and -l options, which prevented things
like iproute2 and XFree86 from linking.
-Erik
Diffstat (limited to 'extra/gcc-uClibc/gcc-uClibc.c')
-rw-r--r-- | extra/gcc-uClibc/gcc-uClibc.c | 87 |
1 files changed, 36 insertions, 51 deletions
diff --git a/extra/gcc-uClibc/gcc-uClibc.c b/extra/gcc-uClibc/gcc-uClibc.c index 2a600f7e7..e1097d0b3 100644 --- a/extra/gcc-uClibc/gcc-uClibc.c +++ b/extra/gcc-uClibc/gcc-uClibc.c @@ -78,7 +78,7 @@ #include "gcc-uClibc.h" -static char *usr_lib_path = "-L"UCLIBC_DEVEL_PREFIX"/lib"; +static char *our_usr_lib_path = "-L"UCLIBC_DEVEL_PREFIX"/lib"; static char static_linking[] = "-static"; static char nostdinc[] = "-nostdinc"; @@ -102,26 +102,10 @@ void xstrcat(char **string, ...) { const char *c; va_list p; -#if 0 - int len = 0; - - /* Calculate how big exerything will be */ - va_start(p, string); - while(1) { - if (!(c = va_arg(p, const char *))) - break; - len+=strlen(c); - } - va_end(p); - va_start(p, string); - *string = xmalloc(len * sizeof(const char) + 2); -#else - /* This is faster. */ /* Don't bother to calculate how big exerything * will be, just be careful to not overflow... */ va_start(p, string); *string = xmalloc(BUFSIZ); -#endif **string = '\0'; while(1) { if (!(c = va_arg(p, const char *))) @@ -137,10 +121,11 @@ int main(int argc, char **argv) int use_stdinc = 1, use_start = 1, use_stdlib = 1; int source_count = 0, use_rpath = 0, verbose = 0; int ctor_dtor = 0, cplusplus = 0; - int i, j, k, l, m; + int i, j, k, l, m, n; char ** gcc_argv; char ** gcc_argument; char ** libraries; + char ** libpath; char *dlstr; char *incstr; char *devprefix; @@ -151,7 +136,7 @@ int main(int argc, char **argv) char *rpath_link[2]; char *rpath[2]; char *uClibc_inc[2]; - char *lib_path[2]; + char *our_lib_path[2]; char *crt0_path[2]; const char *s, *application_name = argv[0]; char *crti_path[2]; @@ -205,8 +190,8 @@ int main(int argc, char **argv) xstrcat(&(crtn_path[0]), devprefix, "/lib/crtn.o", NULL); xstrcat(&(crtn_path[1]), builddir, "/lib/crtn.o", NULL); - xstrcat(&(lib_path[0]), "-L", devprefix, "/lib", NULL); - xstrcat(&(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); build_dlstr = "-Wl,--dynamic-linker," BUILD_DYNAMIC_LINKER; dlstr = getenv("UCLIBC_GCC_DLOPT"); @@ -227,16 +212,14 @@ int main(int argc, char **argv) use_rpath = 1; } -#if 1 m = 0; libraries = __builtin_alloca(sizeof(char*) * (argc)); -#else - if (!(libraries = malloc(sizeof(char) * (argc)))) { - return EXIT_FAILURE; - } -#endif 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]) { @@ -248,9 +231,20 @@ int main(int argc, char **argv) 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; @@ -285,7 +279,14 @@ int main(int argc, char **argv) break; case '-': if (strstr(argv[i]+1,static_linking) != NULL) { - use_static_linking = 1; + 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; } @@ -294,17 +295,8 @@ int main(int argc, char **argv) } } -#if 1 gcc_argv = __builtin_alloca(sizeof(char*) * (argc + 20)); gcc_argument = __builtin_alloca(sizeof(char*) * (argc + 20)); -#else - if (!(gcc_argv = malloc(sizeof(char) * (argc + 20)))) { - return EXIT_FAILURE; - } - if (!(gcc_argument = malloc(sizeof(char) * (argc + 20)))) { - return EXIT_FAILURE; - } -#endif i = 0; k = 0; if (cplusplus && GPLUSPLUS_BIN) @@ -313,18 +305,8 @@ int main(int argc, char **argv) gcc_argv[i++] = GCC_BIN; for ( j = 1 ; j < argc ; j++ ) { - if (strcmp("--uclibc-use-build-dir",argv[j]) == 0) { - use_build_dir = 1; - } else if (strcmp("--uclibc-use-rpath",argv[j]) == 0) { - use_rpath = 1; - } else if (strncmp("-l",argv[j], 2) == 0) { - continue; - } else if (strstr(argv[j],static_linking) != NULL) { - continue; -#if 0 - } else if (strncmp("-v",argv[j], 2) == 0) { + if (argv[j]=='\0') { continue; -#endif } else { gcc_argument[k++] = argv[j]; gcc_argument[k] = '\0'; @@ -348,12 +330,15 @@ int main(int argc, char **argv) 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++] = lib_path[use_build_dir]; + gcc_argv[i++] = our_lib_path[use_build_dir]; if (!use_build_dir) { - gcc_argv[i++] = usr_lib_path; + gcc_argv[i++] = our_usr_lib_path; } } if (use_stdinc && source_count) { @@ -380,7 +365,7 @@ int main(int argc, char **argv) if (use_stdlib) { //gcc_argv[i++] = "-Wl,--start-group"; gcc_argv[i++] = "-lgcc"; - for ( l = m ; l >= 0 ; l-- ) { + for ( l = 0 ; l < m ; l++ ) { if (libraries[l]) gcc_argv[i++] = libraries[l]; } gcc_argv[i++] = "-lc"; |