diff --git a/tools/load-foreign.csh b/tools/load-foreign.csh
index e185e6a6fdf49aac578a5bdbe4823f0068467019..bcc7ceceb0fe69cf80d9c4630098be507df5b95f 100755
--- a/tools/load-foreign.csh
+++ b/tools/load-foreign.csh
@@ -2,18 +2,34 @@
 
 # script run by load-foreign to do OS-specific symbol-table extraction.
 
-if ( `uname` == HP-UX ) then
+switch ( `uname` )
+
+ case HP-UX:
    ld -a archive -N -A $argv[1] -R $argv[2] -o $argv[3] $argv[5-] /lib/dyncall.o
    if ($status != 0) exit 1
 
    /bin/nm -xp $argv[3] | sed -e '/ [tdb] /d' -e 's/^0x//' -e 's/  / /' > $argv[4]
    if ($status != 0) exit 2
-else
+   breaksw
+
+ case FreeBSD:
+ case NetBSD:
+
+   ld -N -R $argv[1] -Ttext $argv[2] -o $argv[3] $argv[5-]
+   if ($status != 0) exit 1
+
+   nm -gp $argv[3] > $argv[4]
+   if ($status != 0) exit 2
+   breaksw
+
+ default:
    ld -N -A $argv[1] -T $argv[2] -o $argv[3] $argv[5-]
    if ($status != 0) exit 1
 
    nm -gp $argv[3] > $argv[4]
    if ($status != 0) exit 2
-endif
+   breaksw
+
+endsw
 
 exit 0