mirror of
git://git.musl-libc.org/musl
synced 2025-03-04 02:37:30 +00:00
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.
61 lines
1.3 KiB
Bash
61 lines
1.3 KiB
Bash
#!/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) 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 -- -std=gnu99 -nostdinc -nostdlib $nosp \
|
|
-isystem "$libc_inc" -isystem "$gcc_inc" "$@" \
|
|
-L"$libc_lib" -L"$libgcc"
|
|
|
|
exec "$gcc" "$@"
|
|
EOF
|