diff --git a/metropolis/node/build/fwprune/main.go b/metropolis/node/build/fwprune/main.go
index 6ad2a93..861a2d0 100644
--- a/metropolis/node/build/fwprune/main.go
+++ b/metropolis/node/build/fwprune/main.go
@@ -8,7 +8,8 @@
 	"bytes"
 	"log"
 	"os"
-	"path/filepath"
+	"path"
+	"regexp"
 	"sort"
 	"strings"
 
@@ -17,6 +18,13 @@
 	"source.monogon.dev/metropolis/node/build/fsspec"
 )
 
+var (
+	// linkRegexp parses the Link: lines in the WHENCE file. This does not have
+	// an official grammar, the regexp has been written in an approximation of
+	// the original parsing algorithm at @linux-firmware//:copy_firmware.sh.
+	linkRegexp = regexp.MustCompile(`(?m:^Link:\s*([^\s]+)\s+->\s+([^\s+]+)\s*$)`)
+)
+
 // fwPaths returns a slice of filesystem paths relative to the root of the
 // linux-firmware repository, pointing at firmware files, according to contents
 // of the kernel build side effect: modules.builtin.modinfo.
@@ -59,15 +67,18 @@
 // and tries to match the requested file paths as a suffix of them.
 // For example if a module requests firmware foo/bar.bin and in the firmware list
 // there is a file at path build-out/x/y/foo/bar.bin it will use that file.
+// It also parses links from the linux-firmware metadata file and uses them
+// for matching requested firmware.
 // Finally it generates an fsspec placing each file under its requested path
 // under /lib/firmware.
 func main() {
-	if len(os.Args) != 4 {
-		log.Fatal("Usage: fwprune modules.builtin.modinfo firmwareListPath outSpec")
+	if len(os.Args) != 5 {
+		log.Fatal("Usage: fwprune modules.builtin.modinfo firmwareListPath metadataFilePath outSpec")
 	}
 	modinfo := os.Args[1]
 	firmwareListPath := os.Args[2]
-	outSpec := os.Args[3]
+	metadataFilePath := os.Args[3]
+	outSpec := os.Args[4]
 
 	allFirmwareData, err := os.ReadFile(firmwareListPath)
 	if err != nil {
@@ -82,10 +93,22 @@
 	for _, firmwarePath := range allFirmwarePaths {
 		pathParts := strings.Split(firmwarePath, string(os.PathSeparator))
 		for i := range pathParts {
-			suffixLUT[filepath.Join(pathParts[i:len(pathParts)]...)] = firmwarePath
+			suffixLUT[path.Join(pathParts[i:len(pathParts)]...)] = firmwarePath
 		}
 	}
 
+	linkMap := make(map[string]string)
+	metadata, err := os.ReadFile(metadataFilePath)
+	if err != nil {
+		log.Fatalf("Failed to read metadata file: %v", err)
+	}
+	linksRaw := linkRegexp.FindAllStringSubmatch(string(metadata), -1)
+	for _, link := range linksRaw {
+		// For links we know the exact path referenced by kernel drives so
+		// a suffix LUT is unnecessary.
+		linkMap[link[1]] = link[2]
+	}
+
 	// Get the firmware file paths used by modules according to modinfo data
 	mi, err := os.ReadFile(modinfo)
 	if err != nil {
@@ -94,22 +117,52 @@
 	fwp := fwPaths(mi)
 
 	var files []*fsspec.File
+	var symlinks []*fsspec.SymbolicLink
 
-	for _, p := range fwp {
+	// This function is called for every requested firmware file and adds and
+	// resolves symlinks until it finds the target file and adds that too.
+	populatedPaths := make(map[string]bool)
+	var chaseReference func(string)
+	chaseReference = func(p string) {
+		if populatedPaths[p] {
+			// Bail if path is already populated. Because of the DAG-like
+			// property of links in filesystems everything transitively pointed
+			// to by anything at this path has already been included.
+			return
+		}
+		placedPath := path.Join("/lib/firmware", p)
+		if linkTarget := linkMap[p]; linkTarget != "" {
+			symlinks = append(symlinks, &fsspec.SymbolicLink{
+				Path:       placedPath,
+				TargetPath: linkTarget,
+			})
+			populatedPaths[placedPath] = true
+			// Symlinks are relative to their place, resolve them to be relative
+			// to the firmware root directory.
+			chaseReference(path.Join(path.Dir(p), linkTarget))
+			return
+		}
 		sourcePath := suffixLUT[p]
 		if sourcePath == "" {
 			// This should not be fatal as sometimes linux-firmware cannot
 			// ship all firmware usable by the kernel for mostly legal reasons.
 			log.Printf("WARNING: Requested firmware %q not found", p)
-			continue
+			return
 		}
 		files = append(files, &fsspec.File{
-			Path:       filepath.Join("/lib/firmware", p),
+			Path:       path.Join("/lib/firmware", p),
 			Mode:       0444,
 			SourcePath: sourcePath,
 		})
+		populatedPaths[path.Join("/lib/firmware", p)] = true
 	}
-	fsspecRaw, err := prototext.Marshal(&fsspec.FSSpec{File: files})
+
+	for _, p := range fwp {
+		chaseReference(p)
+	}
+	// Format output in a both human- and machine-readable form
+	marshalOpts := prototext.MarshalOptions{Multiline: true, Indent: "  "}
+	fsspecRaw, err := marshalOpts.Marshal(&fsspec.FSSpec{File: files, SymbolicLink: symlinks})
 	if err := os.WriteFile(outSpec, fsspecRaw, 0644); err != nil {
 		log.Fatalf("failed writing output: %v", err)
 	}
