diff --git a/src/os/root.go b/src/os/root.go
index 04741c02810baa35593f3aafc3f4061a9ea22e47..f91c0f75f30e2aab0b2c31c0a0f206e07d922cd8 100644
--- a/src/os/root.go
+++ b/src/os/root.go
@@ -60,7 +60,7 @@ func OpenInRoot(dir, name string) (*File, error) {
 //   - When GOOS=plan9 or GOOS=js, Root does not track directories across renames.
 //     On these platforms, a Root references a directory name, not a file descriptor.
 type Root struct {
-	root root
+	root *root
 }
 
 const (
diff --git a/src/os/root_noopenat.go b/src/os/root_noopenat.go
index 8d5ead32b9cd0a7b08d46ccfafab7419d61fd3fa..8be55a029fa2b64afd45ad6e84d2bd30400c5e21 100644
--- a/src/os/root_noopenat.go
+++ b/src/os/root_noopenat.go
@@ -49,7 +49,7 @@ func newRoot(name string) (*Root, error) {
 	if !fi.IsDir() {
 		return nil, errors.New("not a directory")
 	}
-	return &Root{root{name: name}}, nil
+	return &Root{&root{name: name}}, nil
 }
 
 func (r *root) Close() error {
diff --git a/src/os/root_unix.go b/src/os/root_unix.go
index 4b52b81de71e815682b883dbbaa1defabad44a73..02d3b4bdad007e0de69ebb2ffbd206bf2147cea0 100644
--- a/src/os/root_unix.go
+++ b/src/os/root_unix.go
@@ -48,11 +48,11 @@ func newRoot(fd int, name string) (*Root, error) {
 		syscall.CloseOnExec(fd)
 	}
 
-	r := &Root{root{
+	r := &Root{&root{
 		fd:   fd,
 		name: name,
 	}}
-	runtime.SetFinalizer(&r.root, (*root).Close)
+	runtime.SetFinalizer(r.root, (*root).Close)
 	return r, nil
 }
 
diff --git a/src/os/root_windows.go b/src/os/root_windows.go
index dcc311cf86f73156a56e48a960f65bbdff0194d2..32dfa070b740fd2577b295dbf3457335c7f9ad0e 100644
--- a/src/os/root_windows.go
+++ b/src/os/root_windows.go
@@ -105,11 +105,11 @@ func newRoot(fd syscall.Handle, name string) (*Root, error) {
 		return nil, &PathError{Op: "open", Path: name, Err: errors.New("not a directory")}
 	}
 
-	r := &Root{root{
+	r := &Root{&root{
 		fd:   fd,
 		name: name,
 	}}
-	runtime.SetFinalizer(&r.root, (*root).Close)
+	runtime.SetFinalizer(r.root, (*root).Close)
 	return r, nil
 }