--- ./sv.h~	Wed Dec 10 03:06:42 1997
+++ ./sv.h	Sun Mar  1 15:03:16 1998
@@ -128,6 +128,8 @@ struct io {
 
 #define SVpfm_COMPILED	0x80000000
 
+#define SVrv_SOFTLINK	0x80000000	/* Target's refcount not incremented */
+
 #define SVpbm_VALID	0x80000000
 #define SVpbm_TAIL	0x40000000
 
@@ -422,6 +424,9 @@ struct xpvio {
 
 #define SvRV(sv) ((XRV*)  SvANY(sv))->xrv_rv
 #define SvRVx(sv) SvRV(sv)
+
+#define RvSOFT(sv)		(SvFLAGS(sv) & SVrv_SOFTLINK)
+#define RvSOFT_on(sv)		(SvFLAGS(sv) |= SVrv_SOFTLINK)
 
 #define SvIVX(sv) ((XPVIV*)  SvANY(sv))->xiv_iv
 #define SvIVXx(sv) SvIVX(sv)
--- ./sv.c~	Thu Jan 15 11:25:36 1998
+++ ./sv.c	Sun Mar  1 14:51:54 1998
@@ -2736,9 +2736,10 @@ sv_clear(register SV *sv)
 	/* FALL THROUGH */
     case SVt_PV:
     case SVt_RV:
-	if (SvROK(sv))
-	    SvREFCNT_dec(SvRV(sv));
-	else if (SvPVX(sv) && SvLEN(sv))
+	if (SvROK(sv)) {
+	    if (!RvSOFT(sv))
+		SvREFCNT_dec(SvRV(sv));
+	} else if (SvPVX(sv) && SvLEN(sv))
 	    Safefree(SvPVX(sv));
 	break;
 /*
--- ./pp_sys.c~	Fri Dec 12 08:18:14 1997
+++ ./pp_sys.c	Sun Mar  1 15:02:32 1998
@@ -2727,6 +2727,12 @@ PP(pp_link)
 PP(pp_symlink)
 {
     djSP; dTARGET;
+    if (SvROK(TOPs) && TOPs == sp[-1]) {
+	POPs;
+	RvSOFT_on(TOPs);
+	SvREFCNT_dec(SvRV(TOPs));
+	RETPUSHYES;
+    } else {
 #ifdef HAS_SYMLINK
     char *tmps2 = POPp;
     char *tmps = SvPV(TOPs, na);
@@ -2736,6 +2741,7 @@ PP(pp_symlink)
 #else
     DIE(no_func, "symlink");
 #endif
+    }
 }
 
 PP(pp_readlink)
