make gcc wrapper support -shared correctly
authorRich Felker <dalias@aerifal.cx>
Tue, 24 Jan 2012 05:22:27 +0000 (00:22 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 24 Jan 2012 05:22:27 +0000 (00:22 -0500)
it was previously attempting to link start files as part of shared
objects. this is definitely wrong and depending on the platform and
linker could range from just adding extraneous junk to introducing
textrels to making linking fail entirely.

tools/gen-musl-gcc.sh

index 1ef0550..edc4084 100644 (file)
@@ -29,6 +29,7 @@ for i ; do
 case "$skip$i" in
 -I|-L) skip=--- ; continue ;;
 -[cSE]|-M*) nolink=1 ;;
+-shared) nocrt=1 ;;
 -*) ;;
 *) havefile=1 ;;
 esac
@@ -37,13 +38,17 @@ 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 "$libc_start" "$libc_crt" "$@" "$libc_end" \
-  -Wl,--start-group -lc -lgcc -lgcc_eh -Wl,--end-group \
+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
 }