diff options
-rw-r--r-- | extra/gcc-uClibc/Makefile | 1 | ||||
-rw-r--r-- | extra/gcc-uClibc/gcc-uClibc.c | 36 |
2 files changed, 23 insertions, 14 deletions
diff --git a/extra/gcc-uClibc/Makefile b/extra/gcc-uClibc/Makefile index d2cda3c6b..faf4e5c75 100644 --- a/extra/gcc-uClibc/Makefile +++ b/extra/gcc-uClibc/Makefile @@ -24,7 +24,6 @@ gcc-uClibc.h: $(TOPDIR)/Config @echo "#define GCC_BIN " \"$(GCC_BIN)\" >> gcc-uClibc.h @echo "#define GCC_LIB " \"$(GCC_LIB)\" >> gcc-uClibc.h @echo "#define GCC_LIB_DIR " \"$(GCC_LIB_DIR)\" >> gcc-uClibc.h - @echo "#define GCC_INCDIR " \"$(GCCINCDIR)\" >> gcc-uClibc.h @echo "#define TARGET_ARCH " \"$(TARGET_ARCH)\" >> gcc-uClibc.h @echo "#define DYNAMIC_LINKER " \"$(DYNAMIC_LINKER)\" >> gcc-uClibc.h @echo "#define BUILD_DYNAMIC_LINKER " \"$(UCLIBC_DIR)/lib/$(UCLIBC_LDSO)\" >> gcc-uClibc.h diff --git a/extra/gcc-uClibc/gcc-uClibc.c b/extra/gcc-uClibc/gcc-uClibc.c index cf42166f3..16fdd2f71 100644 --- a/extra/gcc-uClibc/gcc-uClibc.c +++ b/extra/gcc-uClibc/gcc-uClibc.c @@ -75,6 +75,7 @@ #include <stdarg.h> #include <string.h> #include <unistd.h> +#include <libgen.h> #include "gcc-uClibc.h" @@ -138,24 +139,30 @@ int main(int argc, char **argv) char *uClibc_inc[2]; char *our_lib_path[2]; char *crt0_path[2]; - const char *s, *application_name = argv[0]; + const char *application_name; char *crti_path[2]; char *crtn_path[2]; char *GPLUSPLUS_BIN = NULL; + int len; + application_name = basename(argv[0]); if (application_name[0] == '-') application_name++; - for (s = application_name; *s != '\0';) { - if (*s++ == '/') - application_name = s; - } + /* We must use strstr since g++ might be named like a - * cross compiler (i.e. arm-linux-g++) . */ - if (strstr(application_name, "g++")!=0 || strstr(application_name, "c++")!=0) { - if ((s=strstr(GCC_BIN,"gcc")) != 0) { - GPLUSPLUS_BIN = strdup(GCC_BIN); - GPLUSPLUS_BIN[1+s-GCC_BIN]='+'; - GPLUSPLUS_BIN[2+s-GCC_BIN]='+'; + * 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)) { + char *gcc_bin = GCC_BIN; + len = strlen(gcc_bin); + if (strcmp(gcc_bin+len-3, "gcc")==0) { + GPLUSPLUS_BIN = strdup(gcc_bin); + GPLUSPLUS_BIN[len-1]='+'; + GPLUSPLUS_BIN[len-2]='+'; } ctor_dtor = 1; cplusplus = 1; @@ -285,6 +292,9 @@ int main(int argc, char **argv) } else if (strcmp("--uclibc-use-rpath",argv[i]) == 0) { use_rpath = 1; argv[i]='\0'; + } else if (strcmp("--uclibc-ctors",argv[i]) == 0) { + ctor_dtor = 1; + argv[i]='\0'; } break; } @@ -343,8 +353,8 @@ int main(int argc, char **argv) gcc_argv[i++] = nostdinc; gcc_argv[i++] = "-isystem"; gcc_argv[i++] = uClibc_inc[use_build_dir]; - gcc_argv[i++] = "-isystem"; - gcc_argv[i++] = GCC_INCDIR; + gcc_argv[i++] = "-iwithprefix"; + gcc_argv[i++] = "include"; if( incstr ) gcc_argv[i++] = incstr; } |