Reputation: 215261
I have a script that needs to prevent gcc from passing -L
with the standard library paths to ld
. Using -nostdlib
inhibits the -lc -lgcc
etc. but not the -L
. Using -Wl,-nostdlib
prevents the linker from using its own standard path, but doesn't stop gcc from passing -L
with the standard paths. Is there any way to ensure that gcc calls the linker with nothing in the library path expect the directories I explicitly write on the command line?
Upvotes: 7
Views: 2130
Reputation: 215261
I found a solution but it depends on gcc 4.4 or later for the -wrapper
option (slightly updated version of the script):
inc=/path/to/alt/incl
lib=/path/to/alt/libs
crt=/path/to/alt/crt1.o
gcc -wrapper sh,-c,'
x= ; z= ; s= ; for i ; do
[ "$z" ] || set -- ; z=1
case "$i" in
-shared) s=1 ; set -- "$@" "$i" ;;
-Lxxxxxx) x=1 ;;
-xxxxxx) x= ; [ "$s" ] || set -- "$@" '"'$crt'"' ;;
*) [ "$x" ] || set -- "$@" "$i" ;;
esac
done
exec "$0" "$@"
' -nostdinc -nostdlib -isystem "$inc" -Wl,-xxxxxx "$@" -L"$lib" -Lxxxxxx -Wl,-nostdlib -lc -lgcc
My version of this wrapper is tuned to re-add alternate crt1.o
and libc
and libgcc
files in place of the ones it prevents access to, but you could just as easily omit them if needed.
Upvotes: 4