]>
Commit | Line | Data |
---|---|---|
ec09a558 AM |
1 | diff -urN uClibc-0.9.29.org/extra/gcc-uClibc/gcc-uClibc.c uClibc-0.9.29/extra/gcc-uClibc/gcc-uClibc.c |
2 | --- uClibc-0.9.29.org/extra/gcc-uClibc/gcc-uClibc.c 1970-01-01 01:00:00.000000000 +0100 | |
06dd9bf8 | 3 | +++ uClibc-0.9.29/extra/gcc-uClibc/gcc-uClibc.c 2007-06-03 22:10:49.372320596 +0200 |
037daaf5 | 4 | @@ -0,0 +1,672 @@ |
06dd9bf8 | 5 | +/* vi: set sw=4 ts=4: */ |
0a954816 AM |
6 | +/* |
7 | + * Copyright (C) 2000 Manuel Novoa III | |
8 | + * Copyright (C) 2002-2003 Erik Andersen | |
9 | + * | |
06dd9bf8 AM |
10 | + * This is a crude wrapper to use uClibc with gcc. |
11 | + * It was originally written to work around ./configure for ext2fs-utils. | |
12 | + * It certainly can be improved, but it works for me in the normal cases. | |
13 | + * | |
14 | + * April 7, 2001 | |
15 | + * | |
16 | + * A bug was fixed in building the gcc command line when dynamic linking. | |
17 | + * The functions dlopen, etc. now work. At this time, you must make sure | |
18 | + * the correct libdl.so is included however. It is safest to, for example, | |
19 | + * add /lib/libdl.so.1 if using ld-linux.so.1 rather than adding -ldl to the | |
20 | + * command line. | |
21 | + * | |
22 | + * Note: This is only a problem if devel and target archs are the same. To | |
23 | + * avoid the problem, you can use a customized dynamic linker. | |
24 | + * | |
25 | + * | |
26 | + * April 18, 2001 | |
27 | + * | |
28 | + * The wrapper now works with either installed and uninstalled uClibc versions. | |
29 | + * If you want to use the uninstalled header files and libs, either include | |
30 | + * the string "build" in the invocation name such as | |
31 | + * 'ln -s <ARCH>-uclibc-gcc <ARCH>-uclibc-gcc-build' | |
32 | + * or include it in the environment variable setting of UCLIBC_ENV. | |
33 | + * Note: This automatically enables the "rpath" behavior described below. | |
34 | + * | |
35 | + * The wrapper will now pass the location of the uClibc shared libs used to | |
36 | + * the linker with the "-rpath" option if the invocation name includes the | |
37 | + * string "rpath" or if the environment variable UCLIBC_ENV include it (as | |
38 | + * with "build" above). This is primarily intended to be used on devel | |
39 | + * platforms of the same arch as the target. A good place to use this feature | |
40 | + * would be in the uClibc/test directory. | |
41 | + * | |
42 | + * The wrapper now displays the command line passed to gcc when '-v' is used. | |
43 | + * | |
44 | + * May 31, 2001 | |
45 | + * | |
46 | + * "rpath" and "build" behavior are now decoupled. You can of course get | |
47 | + * the old "build" behavior by setting UCLIBC_ENV="rpath-build". Order | |
48 | + * isn't important here, as only the substrings are searched for. | |
49 | + * | |
50 | + * Added environment variable check for UCLIBC_GCC_DLOPT to let user specify | |
51 | + * an alternative dynamic linker at runtime without using command line args. | |
52 | + * Since this wouldn't commonly be used, I made it easy on myself. You have | |
53 | + * to match the option you would have passed to the gcc wrapper. As an | |
54 | + * example, | |
55 | + * | |
56 | + * export UCLIBC_GCC_DLOPT="-Wl,--dynamic-linker,/lib/ld-alt-linker.so.3" | |
57 | + * | |
58 | + * This is really only useful if target arch == devel arch and DEVEL_PREFIX | |
59 | + * isn't empty. It involves a recompile, but you can at least test apps | |
60 | + * on your devel system if combined with the "rpath" behavor if by using | |
61 | + * LD_LIBRARY_PATH, etc. | |
62 | + * | |
63 | + * Also added check for "-Wl,--dynamic-linker" on the command line. The | |
64 | + * use default dynamic linker or the envirnment-specified dynamic linker | |
65 | + * is disabled in that case. | |
66 | + * | |
67 | + * Added options --uclibc-use-build-dir and --uclibc-use-rpath so that those | |
68 | + * behaviors can be invoked from the command line. | |
69 | + * | |
70 | + */ | |
71 | + | |
72 | +/* | |
73 | + * | |
74 | + * TODO: | |
75 | + * Check/modify gcc-specific environment variables? | |
0a954816 AM |
76 | + */ |
77 | + | |
78 | +#include <stdio.h> | |
79 | +#include <stdlib.h> | |
80 | +#include <stdarg.h> | |
81 | +#include <string.h> | |
82 | +#include <unistd.h> | |
83 | +#include <errno.h> | |
84 | +#include <sys/stat.h> | |
85 | +#include <sys/wait.h> | |
86 | + | |
06dd9bf8 AM |
87 | +#include "gcc-uClibc.h" |
88 | + | |
89 | +static char *our_usr_lib_path = "-L"UCLIBC_DEVEL_PREFIX"/lib"; | |
90 | + | |
0a954816 AM |
91 | +static char static_linking[] = "-static"; |
92 | +static char nostdinc[] = "-nostdinc"; | |
93 | +static char nostartfiles[] = "-nostartfiles"; | |
94 | +static char nodefaultlibs[] = "-nodefaultlibs"; | |
95 | +static char nostdlib[] = "-nostdlib"; | |
06dd9bf8 | 96 | +#ifdef __UCLIBC_CTOR_DTOR__ |
0a954816 | 97 | +static char nostdinc_plus[] = "-nostdinc++"; |
06dd9bf8 | 98 | +#endif |
0a954816 | 99 | + |
06dd9bf8 AM |
100 | +/* Include a local implementation of basename, since this |
101 | + * uses the host system's C lib, and CYGWIN apparently | |
102 | + * doesn't provide an implementation of basename(). */ | |
103 | +char *basename(const char *path) | |
104 | +{ | |
105 | + register const char *s; | |
106 | + register const char *p; | |
107 | + p = s = path; | |
108 | + while (*s) { | |
109 | + if (*s++ == '/') { | |
110 | + p = s; | |
111 | + } | |
112 | + } | |
113 | + return (char *) p; | |
114 | +} | |
0a954816 | 115 | + |
06dd9bf8 | 116 | +char *dirname(char *path) |
0a954816 | 117 | +{ |
06dd9bf8 AM |
118 | + static const char null_or_empty_or_noslash[] = "."; |
119 | + register char *s; | |
120 | + register char *last; | |
121 | + char *first; | |
122 | + | |
123 | + last = s = path; | |
124 | + | |
125 | + if (s != NULL) { | |
126 | + | |
127 | +LOOP: | |
128 | + while (*s && (*s != '/')) ++s; | |
129 | + first = s; | |
130 | + while (*s == '/') ++s; | |
131 | + if (*s) { | |
132 | + last = first; | |
133 | + goto LOOP; | |
134 | + } | |
0a954816 | 135 | + |
06dd9bf8 AM |
136 | + if (last == path) { |
137 | + if (*last != '/') { | |
138 | + goto DOT; | |
139 | + } | |
140 | + if ((*++last == '/') && (last[1] == 0)) { | |
141 | + ++last; | |
142 | + } | |
143 | + } | |
144 | + *last = 0; | |
145 | + return path; | |
0a954816 | 146 | + } |
06dd9bf8 AM |
147 | +DOT: |
148 | + return (char *) null_or_empty_or_noslash; | |
0a954816 AM |
149 | +} |
150 | + | |
151 | + | |
06dd9bf8 | 152 | +extern void *xmalloc(size_t size) |
0a954816 | 153 | +{ |
06dd9bf8 | 154 | + void *ptr = malloc(size); |
0a954816 | 155 | + |
06dd9bf8 AM |
156 | + if (!ptr) { |
157 | + fprintf(stderr, "memory exhausted"); | |
158 | + exit(EXIT_FAILURE); | |
0a954816 | 159 | + } |
06dd9bf8 AM |
160 | + return ptr; |
161 | +} | |
ec09a558 | 162 | + |
06dd9bf8 AM |
163 | +void xstrcat(char **string, ...) |
164 | +{ | |
165 | + const char *c; | |
166 | + va_list p; | |
167 | + /* Don't bother to calculate how big exerything | |
168 | + * will be, just be careful to not overflow... */ | |
169 | + va_start(p, string); | |
170 | + *string = xmalloc(BUFSIZ); | |
171 | + **string = '\0'; | |
172 | + while(1) { | |
173 | + if (!(c = va_arg(p, const char *))) | |
174 | + break; | |
175 | + strcat(*string, c); | |
176 | + } | |
177 | + va_end(p); | |
0a954816 AM |
178 | +} |
179 | + | |
180 | +int main(int argc, char **argv) | |
181 | +{ | |
182 | + int use_build_dir = 0, linking = 1, use_static_linking = 0; | |
183 | + int use_stdinc = 1, use_start = 1, use_stdlib = 1, use_pic = 0; | |
184 | + int source_count = 0, use_rpath = 0, verbose = 0; | |
06dd9bf8 AM |
185 | + int i, j, k, l, m, n; |
186 | + char ** gcc_argv; | |
187 | + char ** gcc_argument; | |
188 | + char ** libraries; | |
189 | + char ** libpath; | |
190 | + char *dlstr; | |
191 | + char *incstr; | |
192 | + char *devprefix; | |
193 | + char *runprefix; | |
194 | + char *builddir; | |
195 | + char *libstr; | |
196 | + char *build_dlstr = 0; | |
197 | + char *cc; | |
198 | + char *ep; | |
199 | + char *rpath_link[2]; | |
200 | + char *rpath[2]; | |
201 | + char *uClibc_inc[2]; | |
202 | + char *our_lib_path[2]; | |
203 | + char *crt0_path[2]; | |
204 | + char *crtbegin_path[2]; | |
205 | + char *crtend_path[2]; | |
206 | + const char *application_name; | |
207 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
208 | + char *crti_path[2]; | |
209 | + char *crtn_path[2]; | |
210 | + int len; | |
211 | + int ctor_dtor = 1, cplusplus = 0, use_nostdinc_plus = 0; | |
212 | + int findlibgcc = 1; | |
213 | + char *cpp = NULL; | |
214 | +#endif | |
215 | +#ifdef __UCLIBC_PROFILING__ | |
0a954816 AM |
216 | + int profile = 0; |
217 | + char *gcrt1_path[2]; | |
06dd9bf8 AM |
218 | +#endif |
219 | + | |
220 | + cc = getenv("UCLIBC_CC"); | |
221 | + if (cc==NULL) { | |
222 | + cc = GCC_BIN; | |
223 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
224 | + findlibgcc = 0; | |
225 | +#endif | |
ec09a558 AM |
226 | + } |
227 | + | |
06dd9bf8 AM |
228 | + application_name = basename(argv[0]); |
229 | + if (application_name[0] == '-') | |
230 | + application_name++; | |
231 | + | |
232 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
233 | + /* We must use strstr since g++ might be named like a | |
234 | + * cross compiler (i.e. arm-linux-g++). We must also | |
235 | + * search carefully, in case we are searching something | |
236 | + * like /opt/c++/gcc-3.1/bin/arm-linux-g++ or some similar | |
237 | + * perversion... */ | |
238 | + len = strlen(application_name); | |
239 | + if ((strcmp(application_name+len-3, "g++")==0) || | |
240 | + (strcmp(application_name+len-3, "c++")==0)) { | |
0a954816 AM |
241 | + len = strlen(cc); |
242 | + if (strcmp(cc+len-3, "gcc")==0) { | |
243 | + cpp = strdup(cc); | |
244 | + cpp[len-1]='+'; | |
245 | + cpp[len-2]='+'; | |
246 | + } | |
247 | + cplusplus = 1; | |
248 | + use_nostdinc_plus = 1; | |
249 | + } | |
06dd9bf8 | 250 | +#endif |
0a954816 AM |
251 | + |
252 | + devprefix = getenv("UCLIBC_DEVEL_PREFIX"); | |
253 | + if (!devprefix) { | |
06dd9bf8 AM |
254 | + devprefix = UCLIBC_DEVEL_PREFIX; |
255 | + } | |
256 | + | |
257 | + runprefix = getenv("UCLIBC_RUNTIME_PREFIX"); | |
258 | + if (!runprefix) { | |
259 | + runprefix = UCLIBC_RUNTIME_PREFIX; | |
260 | + } | |
261 | + | |
262 | + builddir = getenv("UCLIBC_BUILD_DIR"); | |
263 | + if (!builddir) { | |
264 | + builddir = UCLIBC_BUILD_DIR; | |
0a954816 AM |
265 | + } |
266 | + | |
267 | + incstr = getenv("UCLIBC_GCC_INC"); | |
268 | + libstr = getenv("UCLIBC_GCC_LIB"); | |
269 | + | |
270 | + ep = getenv("UCLIBC_ENV"); | |
271 | + if (!ep) { | |
272 | + ep = ""; | |
273 | + } | |
274 | + | |
275 | + if (strstr(ep,"build") != 0) { | |
276 | + use_build_dir = 1; | |
277 | + } | |
278 | + | |
279 | + if (strstr(ep,"rpath") != 0) { | |
280 | + use_rpath = 1; | |
281 | + } | |
282 | + | |
283 | + | |
06dd9bf8 AM |
284 | + xstrcat(&(rpath_link[0]), "-Wl,-rpath-link,", devprefix, "/lib:", runprefix, "/lib", NULL); |
285 | + xstrcat(&(rpath_link[1]), "-Wl,-rpath-link,", builddir, "/lib", NULL); | |
286 | + | |
287 | + xstrcat(&(rpath[0]), "-Wl,-rpath,", devprefix, "/lib:", runprefix, "/lib", NULL); | |
288 | + xstrcat(&(rpath[1]), "-Wl,-rpath,", builddir, "/lib", NULL); | |
289 | + | |
290 | + xstrcat(&(uClibc_inc[0]), devprefix, "/include/", NULL); | |
291 | + xstrcat(&(uClibc_inc[1]), builddir, "/include/", NULL); | |
292 | + | |
293 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
294 | + xstrcat(&(crt0_path[0]), devprefix, "/lib/crt1.o", NULL); | |
295 | + xstrcat(&(crt0_path[1]), builddir, "/lib/crt1.o", NULL); | |
296 | + xstrcat(&(crti_path[0]), devprefix, "/lib/crti.o", NULL); | |
297 | + xstrcat(&(crti_path[1]), builddir, "/lib/crti.o", NULL); | |
298 | + xstrcat(&(crtn_path[0]), devprefix, "/lib/crtn.o", NULL); | |
299 | + xstrcat(&(crtn_path[1]), builddir, "/lib/crtn.o", NULL); | |
300 | +#else | |
301 | + xstrcat(&(crt0_path[0]), devprefix, "/lib/crt0.o", NULL); | |
302 | + xstrcat(&(crt0_path[1]), builddir, "/lib/crt0.o", NULL); | |
303 | +#endif | |
304 | +#ifdef __UCLIBC_PROFILING__ | |
305 | + xstrcat(&(gcrt1_path[0]), devprefix, "/lib/gcrt1.o", NULL); | |
306 | + xstrcat(&(gcrt1_path[1]), builddir, "/lib/gcrt1.o", NULL); | |
307 | +#endif | |
308 | + | |
309 | + xstrcat(&(our_lib_path[0]), "-L", devprefix, "/lib", NULL); | |
310 | + xstrcat(&(our_lib_path[1]), "-L", builddir, "/lib", NULL); | |
311 | + | |
312 | +#ifdef __UCLIBC_HAS_SHARED__ | |
313 | + build_dlstr = "-Wl,--dynamic-linker," BUILD_DYNAMIC_LINKER; | |
314 | + dlstr = getenv("UCLIBC_GCC_DLOPT"); | |
315 | + if (!dlstr) { | |
316 | + dlstr = "-Wl,--dynamic-linker," DYNAMIC_LINKER; | |
317 | + } | |
318 | +#endif | |
ec09a558 | 319 | + |
06dd9bf8 | 320 | + m = 0; |
0a954816 | 321 | + libraries = __builtin_alloca(sizeof(char*) * (argc)); |
06dd9bf8 | 322 | + libraries[m] = '\0'; |
0a954816 AM |
323 | + |
324 | + n = 0; | |
325 | + libpath = __builtin_alloca(sizeof(char*) * (argc)); | |
326 | + libpath[n] = '\0'; | |
327 | + | |
328 | + for ( i = 1 ; i < argc ; i++ ) { | |
06dd9bf8 | 329 | + if (argv[i][0] == '-') { /* option */ |
0a954816 AM |
330 | + switch (argv[i][1]) { |
331 | + case 'c': /* compile or assemble */ | |
332 | + case 'S': /* generate assembler code */ | |
333 | + case 'E': /* preprocess only */ | |
334 | + case 'M': /* generate dependencies */ | |
335 | + linking = 0; | |
336 | + break; | |
06dd9bf8 | 337 | + case 'L': /* library */ |
0a954816 AM |
338 | + libpath[n++] = argv[i]; |
339 | + libpath[n] = '\0'; | |
340 | + if (argv[i][2] == 0) { | |
341 | + argv[i] = '\0'; | |
342 | + libpath[n++] = argv[++i]; | |
343 | + libpath[n] = '\0'; | |
344 | + } | |
345 | + argv[i] = '\0'; | |
346 | + break; | |
347 | + case 'l': /* library */ | |
06dd9bf8 AM |
348 | + libraries[m++] = argv[i]; |
349 | + libraries[m] = '\0'; | |
0a954816 AM |
350 | + argv[i] = '\0'; |
351 | + break; | |
352 | + case 'v': /* verbose */ | |
353 | + if (argv[i][2] == 0) verbose = 1; | |
354 | + printf("Invoked as %s\n", argv[0]); | |
355 | + break; | |
356 | + case 'n': | |
357 | + if (strcmp(nostdinc,argv[i]) == 0) { | |
358 | + use_stdinc = 0; | |
359 | + } else if (strcmp(nostartfiles,argv[i]) == 0) { | |
06dd9bf8 | 360 | +#ifdef __UCLIBC_CTOR_DTOR__ |
0a954816 | 361 | + ctor_dtor = 0; |
06dd9bf8 | 362 | +#endif |
0a954816 AM |
363 | + use_start = 0; |
364 | + } else if (strcmp(nodefaultlibs,argv[i]) == 0) { | |
365 | + use_stdlib = 0; | |
366 | + argv[i] = '\0'; | |
367 | + } else if (strcmp(nostdlib,argv[i]) == 0) { | |
06dd9bf8 | 368 | +#ifdef __UCLIBC_CTOR_DTOR__ |
0a954816 | 369 | + ctor_dtor = 0; |
06dd9bf8 | 370 | +#endif |
0a954816 AM |
371 | + use_start = 0; |
372 | + use_stdlib = 0; | |
06dd9bf8 AM |
373 | + } |
374 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
375 | + else if (strcmp(nostdinc_plus,argv[i]) == 0) { | |
0a954816 AM |
376 | + if (cplusplus==1) { |
377 | + use_nostdinc_plus = 0; | |
378 | + } | |
379 | + } | |
06dd9bf8 | 380 | +#endif |
0a954816 AM |
381 | + break; |
382 | + case 's': | |
383 | + if (strstr(argv[i],static_linking) != NULL) { | |
384 | + use_static_linking = 1; | |
385 | + } | |
386 | + if (strcmp("-shared",argv[i]) == 0) { | |
387 | + use_start = 0; | |
388 | + use_pic = 1; | |
389 | + } | |
390 | + break; | |
391 | + case 'W': /* -static could be passed directly to ld */ | |
392 | + if (strncmp("-Wl,",argv[i],4) == 0) { | |
393 | + if (strstr(argv[i],static_linking) != 0) { | |
394 | + use_static_linking = 1; | |
395 | + } | |
396 | + if (strstr(argv[i],"--dynamic-linker") != 0) { | |
397 | + dlstr = 0; | |
398 | + } | |
037daaf5 JR |
399 | + if ((strstr(argv[i],"-z,combreloc") != 0) || |
400 | + (strstr(argv[i],"-z,relro") != 0)) { | |
9258f510 JR |
401 | + argv[i] = '\0'; |
402 | + } | |
0a954816 AM |
403 | + } |
404 | + break; | |
06dd9bf8 AM |
405 | +#ifdef __UCLIBC_PROFILING__ |
406 | + case 'p': | |
407 | + if (strcmp("-pg",argv[i]) == 0) { | |
408 | + profile = 1; | |
409 | + } | |
0a954816 | 410 | + break; |
06dd9bf8 | 411 | +#endif |
0a954816 AM |
412 | + case 'f': |
413 | + /* Check if we are doing PIC */ | |
414 | + if (strcmp("-fPIC",argv[i]) == 0) { | |
415 | + use_pic = 1; | |
416 | + } else if (strcmp("-fpic",argv[i]) == 0) { | |
417 | + use_pic = 1; | |
06dd9bf8 AM |
418 | + } |
419 | +#ifdef __UCLIBC_PROFILING__ | |
420 | + else if (strcmp("-fprofile-arcs",argv[i]) == 0) { | |
0a954816 AM |
421 | + profile = 1; |
422 | + } | |
06dd9bf8 | 423 | +#endif |
0a954816 AM |
424 | + break; |
425 | + | |
426 | + case '-': | |
06dd9bf8 | 427 | + if (strstr(argv[i]+1,static_linking) != NULL) { |
0a954816 AM |
428 | + use_static_linking = 1; |
429 | + argv[i]='\0'; | |
430 | + } else if (strcmp("--uclibc-use-build-dir",argv[i]) == 0) { | |
431 | + use_build_dir = 1; | |
432 | + argv[i]='\0'; | |
433 | + } else if (strcmp("--uclibc-use-rpath",argv[i]) == 0) { | |
434 | + use_rpath = 1; | |
435 | + argv[i]='\0'; | |
436 | + } else if (strcmp ("--uclibc-cc", argv[i]) == 0 && argv[i + 1]) { | |
437 | + cc = argv[i + 1]; | |
438 | + argv[i] = 0; | |
439 | + argv[i + 1] = 0; | |
440 | + } else if (strncmp ("--uclibc-cc=", argv[i], 12) == 0) { | |
441 | + cc = argv[i] + 12; | |
442 | + argv[i] = 0; | |
06dd9bf8 AM |
443 | + } |
444 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
445 | + else if (strcmp("--uclibc-no-ctors",argv[i]) == 0) { | |
0a954816 AM |
446 | + ctor_dtor = 0; |
447 | + argv[i]='\0'; | |
448 | + } | |
06dd9bf8 | 449 | +#endif |
0a954816 AM |
450 | + break; |
451 | + } | |
452 | + } else { /* assume it is an existing source file */ | |
453 | + ++source_count; | |
454 | + } | |
455 | + } | |
456 | + | |
06dd9bf8 AM |
457 | + gcc_argv = __builtin_alloca(sizeof(char*) * (argc + 64)); |
458 | + gcc_argument = __builtin_alloca(sizeof(char*) * (argc + 20)); | |
0a954816 | 459 | + |
06dd9bf8 AM |
460 | + i = 0; k = 0; |
461 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
0a954816 | 462 | + if (ctor_dtor) { |
06dd9bf8 AM |
463 | + struct stat statbuf; |
464 | + if (findlibgcc==1 || stat(LIBGCC_DIR, &statbuf)!=0 || | |
465 | + !S_ISDIR(statbuf.st_mode)) | |
466 | + { | |
467 | + /* Bummer, gcc is hiding from us. This is going | |
468 | + * to really slow things down... bummer. */ | |
469 | + int status, gcc_pipe[2]; | |
470 | + pid_t pid, wpid; | |
471 | + | |
472 | + pipe(gcc_pipe); | |
473 | + if (!(pid = fork())) { | |
474 | + char *argv[4]; | |
475 | + close(gcc_pipe[0]); | |
476 | + close(1); | |
477 | + close(2); | |
478 | + dup2(gcc_pipe[1], 1); | |
479 | + dup2(gcc_pipe[1], 2); | |
480 | + argv[0] = cc; | |
481 | + argv[1] = "-print-libgcc-file-name"; | |
482 | + argv[2] = NULL; | |
483 | + execvp(cc, argv); | |
484 | + close(gcc_pipe[1]); | |
485 | + _exit(EXIT_FAILURE); | |
486 | + } | |
487 | + wpid=0; | |
488 | + while (wpid != pid) { | |
489 | + wpid = wait(&status); | |
490 | + } | |
491 | + close(gcc_pipe[1]); | |
492 | + if (WIFEXITED(status) && WEXITSTATUS(status)) { | |
493 | +crash_n_burn: | |
494 | + fprintf(stderr, "Unable to locale crtbegin.o provided by gcc"); | |
495 | + exit(EXIT_FAILURE); | |
496 | + } | |
497 | + if (WIFSIGNALED(status)) { | |
498 | + fprintf(stderr, "%s exited because of uncaught signal %d", cc, WTERMSIG(status)); | |
499 | + exit(EXIT_FAILURE); | |
500 | + } | |
501 | + | |
502 | + { | |
503 | + char buf[1024], *dir; | |
504 | + status = read(gcc_pipe[0], buf, sizeof(buf)); | |
505 | + close(gcc_pipe[0]); | |
506 | + if (status < 0) { | |
507 | + goto crash_n_burn; | |
508 | + } | |
509 | + buf[(status == sizeof(buf)) ? status-1 : status] = 0; | |
510 | + dir = dirname(buf); | |
511 | + xstrcat(&(crtbegin_path[0]), dir, "/crtbegin.o", NULL); | |
512 | + xstrcat(&(crtbegin_path[1]), dir, "/crtbeginS.o", NULL); | |
513 | + xstrcat(&(crtend_path[0]), dir, "/crtend.o", NULL); | |
514 | + xstrcat(&(crtend_path[1]), dir, "/crtendS.o", NULL); | |
515 | + } | |
516 | + | |
517 | + } else { | |
518 | + xstrcat(&(crtbegin_path[0]), LIBGCC_DIR, "crtbegin.o", NULL); | |
519 | + xstrcat(&(crtbegin_path[1]), LIBGCC_DIR, "crtbeginS.o", NULL); | |
520 | + xstrcat(&(crtend_path[0]), LIBGCC_DIR, "crtend.o", NULL); | |
521 | + xstrcat(&(crtend_path[1]), LIBGCC_DIR, "crtendS.o", NULL); | |
522 | + } | |
0a954816 AM |
523 | + } |
524 | + | |
06dd9bf8 AM |
525 | + if (cplusplus && cpp) |
526 | + gcc_argv[i++] = cpp; | |
527 | + else | |
528 | +#endif | |
529 | + gcc_argv[i++] = cc; | |
0a954816 | 530 | + |
06dd9bf8 AM |
531 | + for ( j = 1 ; j < argc ; j++ ) { |
532 | + if (argv[j]=='\0') { | |
533 | + continue; | |
534 | + } else { | |
535 | + gcc_argument[k++] = argv[j]; | |
536 | + gcc_argument[k] = '\0'; | |
537 | + } | |
538 | + } | |
0a954816 AM |
539 | + |
540 | + if (linking && source_count) { | |
27ff6bfd | 541 | + gcc_argv[i++] = "-Wl,--hash-style=gnu"; |
06dd9bf8 AM |
542 | +#if defined __HAVE_ELF__ && ! defined __UCLIBC_HAS_MMU__ |
543 | + gcc_argv[i++] = "-Wl,-elf2flt"; | |
544 | +#endif | |
545 | + gcc_argv[i++] = nostdlib; | |
0a954816 | 546 | + if (use_static_linking) { |
06dd9bf8 AM |
547 | + gcc_argv[i++] = static_linking; |
548 | + } | |
549 | + if (!use_static_linking) { | |
0a954816 | 550 | + if (dlstr && use_build_dir) { |
06dd9bf8 | 551 | + gcc_argv[i++] = build_dlstr; |
0a954816 | 552 | + } else if (dlstr) { |
06dd9bf8 | 553 | + gcc_argv[i++] = dlstr; |
0a954816 AM |
554 | + } |
555 | + if (use_rpath) { | |
06dd9bf8 | 556 | + gcc_argv[i++] = rpath[use_build_dir]; |
0a954816 AM |
557 | + } |
558 | + } | |
06dd9bf8 AM |
559 | + for ( l = 0 ; l < n ; l++ ) { |
560 | + if (libpath[l]) gcc_argv[i++] = libpath[l]; | |
561 | + } | |
562 | + gcc_argv[i++] = rpath_link[use_build_dir]; /* just to be safe */ | |
0a954816 | 563 | + if( libstr ) |
06dd9bf8 AM |
564 | + gcc_argv[i++] = libstr; |
565 | + gcc_argv[i++] = our_lib_path[use_build_dir]; | |
566 | + if (!use_build_dir) { | |
567 | + gcc_argv[i++] = our_usr_lib_path; | |
568 | + } | |
0a954816 AM |
569 | + } |
570 | + if (use_stdinc && source_count) { | |
06dd9bf8 AM |
571 | + gcc_argv[i++] = nostdinc; |
572 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
0a954816 | 573 | + if (cplusplus) { |
06dd9bf8 | 574 | + char *cppinc; |
0a954816 | 575 | + if (use_nostdinc_plus) { |
06dd9bf8 | 576 | + gcc_argv[i++] = nostdinc_plus; |
0a954816 | 577 | + } |
06dd9bf8 AM |
578 | + xstrcat(&cppinc, uClibc_inc[use_build_dir], "g++/", NULL); |
579 | + gcc_argv[i++] = "-isystem"; | |
580 | + gcc_argv[i++] = cppinc; | |
581 | + xstrcat(&cppinc, uClibc_inc[use_build_dir], "g++-v3/", NULL); | |
582 | + gcc_argv[i++] = "-isystem"; | |
583 | + gcc_argv[i++] = cppinc; | |
0a954816 | 584 | + } |
06dd9bf8 AM |
585 | +#endif |
586 | + gcc_argv[i++] = "-isystem"; | |
587 | + gcc_argv[i++] = uClibc_inc[use_build_dir]; | |
588 | + gcc_argv[i++] = "-iwithprefix"; | |
589 | + gcc_argv[i++] = "include"; | |
590 | + if( incstr ) | |
591 | + gcc_argv[i++] = incstr; | |
0a954816 AM |
592 | + } |
593 | + | |
594 | + if (linking && source_count) { | |
595 | + | |
06dd9bf8 | 596 | +#ifdef __UCLIBC_PROFILING__ |
0a954816 | 597 | + if (profile) { |
06dd9bf8 | 598 | + gcc_argv[i++] = gcrt1_path[use_build_dir]; |
0a954816 | 599 | + } |
06dd9bf8 AM |
600 | +#endif |
601 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
0a954816 | 602 | + if (ctor_dtor) { |
06dd9bf8 | 603 | + gcc_argv[i++] = crti_path[use_build_dir]; |
0a954816 | 604 | + if (use_pic) { |
06dd9bf8 | 605 | + gcc_argv[i++] = crtbegin_path[1]; |
0a954816 | 606 | + } else { |
06dd9bf8 | 607 | + gcc_argv[i++] = crtbegin_path[0]; |
0a954816 AM |
608 | + } |
609 | + } | |
06dd9bf8 | 610 | +#endif |
0a954816 | 611 | + if (use_start) { |
06dd9bf8 AM |
612 | +#ifdef __UCLIBC_PROFILING__ |
613 | + if (!profile) | |
614 | +#endif | |
615 | + { | |
616 | + gcc_argv[i++] = crt0_path[use_build_dir]; | |
0a954816 AM |
617 | + } |
618 | + } | |
06dd9bf8 AM |
619 | + for ( l = 0 ; l < k ; l++ ) { |
620 | + if (gcc_argument[l]) gcc_argv[i++] = gcc_argument[l]; | |
621 | + } | |
0a954816 | 622 | + if (use_stdlib) { |
06dd9bf8 AM |
623 | + //gcc_argv[i++] = "-Wl,--start-group"; |
624 | + gcc_argv[i++] = "-lgcc"; | |
625 | + } | |
626 | + for ( l = 0 ; l < m ; l++ ) { | |
627 | + if (libraries[l]) gcc_argv[i++] = libraries[l]; | |
0a954816 AM |
628 | + } |
629 | + if (use_stdlib) { | |
06dd9bf8 | 630 | +#ifdef __UCLIBC_CTOR_DTOR__ |
0a954816 | 631 | + if (cplusplus) { |
06dd9bf8 AM |
632 | + gcc_argv[ i++ ] = "-lstdc++"; |
633 | + gcc_argv[ i++ ] = "-lm"; | |
0a954816 | 634 | + } |
06dd9bf8 AM |
635 | +#endif |
636 | + gcc_argv[i++] = "-lc"; | |
637 | + gcc_argv[i++] = "-lgcc"; | |
638 | + //gcc_argv[i++] = "-Wl,--end-group"; | |
0a954816 | 639 | + } |
06dd9bf8 | 640 | +#ifdef __UCLIBC_CTOR_DTOR__ |
0a954816 | 641 | + if (ctor_dtor) { |
06dd9bf8 AM |
642 | + if (use_pic) { |
643 | + gcc_argv[i++] = crtend_path[1]; | |
644 | + } else { | |
645 | + gcc_argv[i++] = crtend_path[0]; | |
646 | + } | |
ec09a558 | 647 | + |
06dd9bf8 AM |
648 | + gcc_argv[i++] = crtn_path[use_build_dir]; |
649 | + } | |
650 | +#endif | |
651 | + } else { | |
652 | + for ( l = 0 ; l < k ; l++ ) { | |
653 | + if (gcc_argument[l]) gcc_argv[i++] = gcc_argument[l]; | |
654 | + } | |
655 | + } | |
656 | + gcc_argv[i++] = NULL; | |
0a954816 AM |
657 | + |
658 | + if (verbose) { | |
06dd9bf8 AM |
659 | + for ( j = 0 ; gcc_argv[j] ; j++ ) { |
660 | + printf("arg[%2i] = %s\n", j, gcc_argv[j]); | |
0a954816 AM |
661 | + } |
662 | + fflush(stdout); | |
663 | + } | |
06dd9bf8 AM |
664 | + //no need to free memory from xstrcat because we never return... |
665 | +#ifdef __UCLIBC_CTOR_DTOR__ | |
666 | + if (cplusplus && cpp) { | |
667 | + execvp(cpp, gcc_argv); | |
668 | + fprintf(stderr, "%s: %s\n", cpp, strerror(errno)); | |
669 | + } else | |
670 | +#endif | |
671 | + { | |
672 | + execvp(cc, gcc_argv); | |
673 | + fprintf(stderr, "%s: %s\n", cc, strerror(errno)); | |
0a954816 AM |
674 | + } |
675 | + exit(EXIT_FAILURE); | |
676 | +} | |
ec09a558 AM |
677 | diff -urN uClibc-0.9.29.org/extra/gcc-uClibc/Makefile uClibc-0.9.29/extra/gcc-uClibc/Makefile |
678 | --- uClibc-0.9.29.org/extra/gcc-uClibc/Makefile 1970-01-01 01:00:00.000000000 +0100 | |
06dd9bf8 | 679 | +++ uClibc-0.9.29/extra/gcc-uClibc/Makefile 2007-06-03 22:10:14.593807939 +0200 |
9119c9cd | 680 | @@ -0,0 +1,93 @@ |
0a954816 AM |
681 | +# Makefile for building a fake gcc/binutils toolchain |
682 | +# that simply spoofs the location of the C library | |
683 | +# | |
684 | +# Copyright (C) 2000-2002 Erik Andersen <andersen@uclibc.org> | |
685 | +# | |
686 | + | |
687 | +TOPDIR = ../../ | |
688 | +include $(TOPDIR)Rules.mak | |
a6527d51 | 689 | +include $(TOPDIR)/.config |
0a954816 AM |
690 | + |
691 | +UCLIBC_DIR = $(shell (cd ../.. ; /bin/pwd)) | |
692 | +GCC_BIN = $(shell which $(CC)) | |
693 | +LD_BIN = $(shell which $(LD)) | |
694 | +GCCINCDIR:= ${shell $(CC) -print-search-dirs | sed -ne "s/install: \(.*\)/\1include/gp"} | |
695 | + | |
696 | +all: gcc-uClibc ld-uClibc | |
697 | + | |
698 | +gcc-uClibc.h: Makefile $(TOPDIR)/.config | |
699 | + @echo "/* this file was autogenerated by make */" > gcc-uClibc.h | |
700 | + @echo "#define UCLIBC_TARGET_PREFIX " \"$(TARGET_PREFIX)\" >> gcc-uClibc.h | |
701 | + @echo "#define UCLIBC_DEVEL_PREFIX " \"$(DEVEL_PREFIX)\" >> gcc-uClibc.h | |
9119c9cd | 702 | + @echo "#define UCLIBC_RUNTIME_PREFIX " \"$(RUNTIME_PREFIX)\" >> gcc-uClibc.h |
0a954816 AM |
703 | + @echo "#define UCLIBC_BUILD_DIR " \"$(UCLIBC_DIR)\" >> gcc-uClibc.h |
704 | + @echo "#define GCC_BIN " \"$(GCC_BIN)\" >> gcc-uClibc.h | |
705 | + @echo "#define LIBGCC_DIR " \"$(LIBGCC_DIR)\" >> gcc-uClibc.h | |
706 | + @echo "#define TARGET_ARCH " \"$(TARGET_ARCH)\" >> gcc-uClibc.h | |
a6527d51 | 707 | + @echo "#define DYNAMIC_LINKER " \"$(RUNTIME_PREFIX)/lib/$(UCLIBC_LDSO)\" >> gcc-uClibc.h |
0a954816 AM |
708 | + @echo "#define BUILD_DYNAMIC_LINKER " \"$(UCLIBC_DIR)/lib/$(UCLIBC_LDSO)\" >> gcc-uClibc.h |
709 | +ifeq ($(strip $(HAVE_SHARED)),y) | |
710 | + @echo "#define __UCLIBC_HAS_SHARED__ 1" >> gcc-uClibc.h | |
711 | +else | |
712 | + @echo "#undef __UCLIBC_HAS_SHARED__" >> gcc-uClibc.h | |
713 | +endif | |
714 | +ifeq ($(strip $(UCLIBC_HAS_MMU)),y) | |
715 | + @echo "#define __UCLIBC_HAS_MMU__ 1" >> gcc-uClibc.h | |
716 | +else | |
717 | + @echo "#undef __UCLIBC_HAS_MMU__" >> gcc-uClibc.h | |
718 | +endif | |
719 | +ifeq ($(strip $(HAS_ELF)),y) | |
720 | + @echo "#define __HAS_ELF__ 1" >> gcc-uClibc.h | |
721 | +else | |
722 | + @echo "#undef __HAS_ELF__" >> gcc-uClibc.h | |
723 | +endif | |
724 | +ifeq ($(strip $(UCLIBC_CTOR_DTOR)),y) | |
725 | + @echo "#define __UCLIBC_CTOR_DTOR__ 1" >> gcc-uClibc.h | |
726 | +ifeq ($(strip $(UCLIBC_PROFILING)),y) | |
727 | + @echo "#define __UCLIBC_PROFILING__ 1" >> gcc-uClibc.h | |
728 | +else | |
729 | + @echo "#undef __UCLIBC_PROFILING__" >> gcc-uClibc.h | |
730 | +endif | |
731 | +else | |
732 | + @echo "#undef __UCLIBC_CTOR_DTOR__" >> gcc-uClibc.h | |
733 | +endif | |
734 | + | |
735 | +gcc-uClibc: gcc-uClibc.h gcc-uClibc.c | |
736 | + $(HOSTCC) $(HOSTCFLAGS) -s gcc-uClibc.c -o $(TARGET_ARCH)-uclibc-gcc | |
90de3b5b | 737 | + touch gcc-uClibc |
0a954816 AM |
738 | + |
739 | +ld-uClibc: | |
740 | + @echo "#!/bin/sh" > $(TARGET_ARCH)-uclibc-ld | |
741 | + @echo "# This file was autogenerated by make" >> $(TARGET_ARCH)-uclibc-ld | |
a6527d51 | 742 | + @echo "exec $(LD_BIN) \$$@ -L$(DEVEL_PREFIX)/lib" >> $(TARGET_ARCH)-uclibc-ld |
0a954816 | 743 | + chmod a+x $(TARGET_ARCH)-uclibc-ld |
90de3b5b | 744 | + touch ld-uClibc |
0a954816 AM |
745 | + |
746 | +install: all | |
747 | + install -d $(PREFIX)$(DEVEL_PREFIX)/bin; | |
748 | + install -d $(PREFIX)$(RUNTIME_PREFIX)/bin; | |
749 | + install -m 755 $(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(RUNTIME_PREFIX)/bin/ | |
750 | + install -m 755 $(TARGET_ARCH)-uclibc-ld $(PREFIX)$(RUNTIME_PREFIX)/bin/ | |
751 | + ln -fs $(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-cc | |
752 | + ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(DEVEL_PREFIX)/bin/gcc | |
753 | + ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(DEVEL_PREFIX)/bin/cc | |
754 | + ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-ld $(PREFIX)$(DEVEL_PREFIX)/bin/ld | |
755 | +ifeq ($(strip $(UCLIBC_CTOR_DTOR)),y) | |
756 | + ln -fs $(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-g++ | |
757 | + ln -fs $(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-c++ | |
758 | + ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(DEVEL_PREFIX)/bin/c++ | |
759 | + ln -fs $(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-gcc $(PREFIX)$(DEVEL_PREFIX)/bin/g++ | |
760 | +endif | |
3e880be8 | 761 | + for app in addr2line ar as cpp nm objcopy \ |
0a954816 AM |
762 | + objdump ranlib size strings strip; do \ |
763 | + APPNAME=`which $(CROSS)$${app}`; \ | |
764 | + if [ -x "$$APPNAME" ] ; then \ | |
765 | + ln -fs "$$APPNAME" $(PREFIX)$(DEVEL_PREFIX)/bin/$${app}; \ | |
766 | + ln -fs "$$APPNAME" $(PREFIX)$(RUNTIME_PREFIX)/bin/$(TARGET_ARCH)-uclibc-$${app}; \ | |
767 | + fi; \ | |
768 | + done | |
769 | + | |
770 | +clean: | |
771 | + rm -f gcc-uClibc.h *-uclibc-gcc *-uclibc-ld core | |
772 | + | |
773 | + | |
3e880be8 JB |
774 | --- uClibc-0.9.32/Makefile.in.orig 2011-06-08 21:35:20.000000000 +0200 |
775 | +++ uClibc-0.9.32/Makefile.in 2011-06-12 09:20:09.634046086 +0200 | |
776 | @@ -23,7 +23,7 @@ | |
0a954816 | 777 | |
a6527d51 | 778 | ifeq ($(HAVE_DOT_CONFIG),y) |
0a954816 | 779 | |
a6527d51 JB |
780 | -all: pregen libs |
781 | +all: pregen libs toolchain | |
5f6495ab | 782 | libs: pregen |
0a954816 | 783 | |
a6527d51 | 784 | # In this section, we need .config |
3e880be8 | 785 | @@ -192,7 +192,7 @@ |
5f6495ab | 786 | HOSTCC="$(HOSTCC)" \ |
8a1bb06c | 787 | install_dev |
0a954816 | 788 | |
a6527d51 JB |
789 | -install: install_runtime install_dev |
790 | +install: install_runtime install_dev install_toolchain | |
0a954816 AM |
791 | |
792 | ||
3e880be8 JB |
793 | RUNTIME_PREFIX_LIB_FROM_DEVEL_PREFIX_LIB=$(shell $(top_srcdir)extra/scripts/relative_path.sh $(DEVEL_PREFIX)$(MULTILIB_DIR) $(RUNTIME_PREFIX)$(MULTILIB_DIR)) |
794 | @@ -405,6 +405,12 @@ | |
7df99d51 JB |
795 | |
796 | endif # ifeq ($(HAVE_DOT_CONFIG),y) | |
0a954816 | 797 | |
a6527d51 JB |
798 | +toolchain: |
799 | + $(MAKE) CROSS="$(CROSS)" CC="$(CC)" -C extra/gcc-uClibc | |
0a954816 | 800 | + |
a6527d51 JB |
801 | +install_toolchain: toolchain |
802 | + $(MAKE) CROSS="$(CROSS)" CC="$(CC)" -C extra/gcc-uClibc install | |
803 | + | |
3e880be8 | 804 | hostutils: | pregen |
7df99d51 JB |
805 | $(Q)$(MAKE) CROSS="$(CROSS)" CC="$(CC)" HOSTCC="$(HOSTCC)" DOTHOST=.host -C utils $@ |
806 |