about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Makefile10
-rw-r--r--tools/gen-musl-gcc.sh60
-rw-r--r--tools/musl-gcc.specs.sh39
4 files changed, 47 insertions, 63 deletions
diff --git a/.gitignore b/.gitignore
index c1a6cd51..455e3580 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ arch/*/bits/alltypes.h
 config.mak
 include/bits
 tools/musl-gcc
+lib/musl-gcc.specs
diff --git a/Makefile b/Makefile
index 7906c52f..72b640a4 100644
--- a/Makefile
+++ b/Makefile
@@ -36,7 +36,8 @@ EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
 CRT_LIBS = lib/crt1.o lib/crti.o lib/crtn.o
 STATIC_LIBS = lib/libc.a $(EMPTY_LIBS)
 SHARED_LIBS = lib/libc.so
-ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS)
+TOOL_LIBS = lib/musl-gcc.specs
+ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(TOOL_LIBS)
 ALL_TOOLS = tools/musl-gcc
 
 LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH).so.1
@@ -93,8 +94,11 @@ $(EMPTY_LIBS):
 lib/%.o: crt/%.o
 	cp $< $@
 
-tools/musl-gcc: tools/gen-musl-gcc.sh config.mak
-	sh $< "$(prefix)" "$(LDSO_PATHNAME)" > $@ || { rm -f $@ ; exit 1 ; }
+lib/musl-gcc.specs: tools/musl-gcc.specs.sh config.mak
+	sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@
+
+tools/musl-gcc: config.mak
+	printf '#!/bin/sh\nexec gcc "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@
 	chmod +x $@
 
 $(DESTDIR)$(bindir)/%: tools/%
diff --git a/tools/gen-musl-gcc.sh b/tools/gen-musl-gcc.sh
deleted file mode 100644
index 7b80fda6..00000000
--- a/tools/gen-musl-gcc.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/bin/sh
-
-printf '#!/bin/sh\n\nlibc_prefix="%s"\nldso_pathname="%s"\n' "$1" "$2"
-
-cat <<"EOF"
-gcc=gcc
-libc_lib=$libc_prefix/lib
-libc_inc=$libc_prefix/include
-libc_crt="$libc_lib/crt1.o"
-libc_start="$libc_lib/crti.o"
-libc_end="$libc_lib/crtn.o"
-
-gcc_inc=$libc_inc
-libgcc="$("$gcc" -print-file-name=libgcc.a)"
-libgcc=${libgcc%/libgcc.a}
-
-gccver=${libgcc##*/}
-gcctarget=${libgcc%/*}
-gcctarget=${gcctarget##*/}
-
-case "$gccver" in
-[0123].*|4.[01]*) ;;
-*) nosp=-fno-stack-protector ;;
-esac
-
-[ "x$1" = "x-V" ] && { printf "%s: -V not supported\n" "$0" ; exit 1 ; }
-
-for i ; do
-case "$skip$i" in
--I|-L) skip=--- ; continue ;;
--[cSE]|-M*) nolink=1 ;;
--shared|-nostartfiles|-nostdlib) nocrt=1 ;;
--*) ;;
-*) havefile=1 ;;
-esac
-skip=
-done
-
-[ "$havefile" ] || nolink=1
-
-[ "$nolink" ] && nocrt=1
-
-[ "$nocrt" ] || set -- "$libc_start" "$libc_crt" "$@" "$libc_end" \
-
-[ "$nolink" ] || {
-tmp_specs=$HOME/.specs.tmp.$$
-printf '*link_libgcc:\n\n\n' > "$tmp_specs" || exit 1
-exec 3<"$tmp_specs"
-rm -f "$tmp_specs"
-set -- -specs=/proc/self/fd/3 "$@" \
-  -Wl,--as-needed -Wl,--start-group -lc -lgcc -lgcc_eh -Wl,--end-group \
-  -Wl,-dynamic-linker,"$ldso_pathname" -Wl,-nostdlib
-}
-
-set -- -nostdinc -nostdlib $nosp \
-  -isystem "$libc_inc" -isystem "$gcc_inc" "$@" \
-  -L"$libc_lib" -L"$libgcc"
-
-exec "$gcc" "$@"
-EOF
diff --git a/tools/musl-gcc.specs.sh b/tools/musl-gcc.specs.sh
new file mode 100644
index 00000000..30b2676d
--- /dev/null
+++ b/tools/musl-gcc.specs.sh
@@ -0,0 +1,39 @@
+incdir=$1
+libdir=$2
+ldso=$3
+cat <<EOF
+%rename cpp_options old_cpp_options
+
+*cpp_options:
+-nostdinc -isystem $incdir %(old_cpp_options)
+
+*cc1:
+%(cc1_cpu) -nostdinc -isystem $incdir 
+
+*link_libgcc:
+-L$libdir
+
+*libgcc:
+libgcc.a%s %:if-exists(libgcc_eh.a%s)
+
+*startfile:
+%{!shared: $libdir/crt1.o} $libdir/crti.o %{shared|pie:crtbeginS.o%s;:crtbegin.o%s}
+
+*endfile:
+%{shared|pie:crtendS.o%s;:crtend.o%s} $libdir/crtn.o
+
+%rename link old_link
+
+*link:
+%(old_link) -dynamic-linker $ldso -nostdlib
+
+*esp_link:
+
+
+*esp_options:
+
+
+*esp_cpp_options:
+
+
+EOF