diff --git a/tools/cpiod/cpio.cc b/tools/cpiod/cpio.cc
index ccf846fe678e262d5417e1dcc6c3b777fbd961ae..9e1603adcf8181000a2f7ac3ed05cf238e127554 100644
--- a/tools/cpiod/cpio.cc
+++ b/tools/cpiod/cpio.cc
@@ -96,6 +96,13 @@ bool cpio_in::parse_one(istream& is, cpio_in& out)
         out.add_file(name, file);
         break;
     }
+    case C_ISLNK: {
+        unique_ptr<char[]> targetbuf{new char[filesize]};
+        is.read(targetbuf.get(), filesize);
+        string target{targetbuf.get(), filesize};
+        out.add_symlink(name, target);
+	break;
+    }
     default:
         cout << name << ": unknown type " << type << "\n";
         is.ignore(filesize);
diff --git a/tools/cpiod/cpio.hh b/tools/cpiod/cpio.hh
index b2fb732384c7e64e068db4e1fd2df14cf001142a..1ee6c8b6264f8d45acffb7d7ae5bc83e4f93d65c 100644
--- a/tools/cpiod/cpio.hh
+++ b/tools/cpiod/cpio.hh
@@ -18,6 +18,7 @@ class cpio_in {
 public:
     virtual ~cpio_in();
     virtual void add_file(std::string name, std::istream& is) = 0;
+    virtual void add_symlink(std::string oldpath, std::string newpath) = 0;
 public:
     static void parse(std::istream& is, cpio_in& out);
 private:
diff --git a/tools/cpiod/cpiod.cc b/tools/cpiod/cpiod.cc
index 3d6d3a07b51400465ec9d508adace70e51aa4b9b..e6a66ad1461d239ac69830e7c445de23cd340807 100644
--- a/tools/cpiod/cpiod.cc
+++ b/tools/cpiod/cpiod.cc
@@ -34,6 +34,9 @@ public:
         ofstream os(name);
         os << is.rdbuf();
     }
+    virtual void add_symlink(string oldpath, string newpath) override {
+        cout << "Skipping symlink " << oldpath << "...\n";
+    }
 
 private:
     std::string _prefix;