diff --git a/tests/.gitignore b/tests/.gitignore
index d25e2d6249151b770c07da07716c81b88b9649f4..7b70bccffc40d658e29d3a82098cafef75130ba3 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -1,3 +1,4 @@
+/gen/
 /alloc
 /args
 /atof
diff --git a/tests/Makefile b/tests/Makefile
index 15e80e24a04726ba67e3b4ace105e5bc1bed3cd5..6c2a838d878c6e7498fa8909e987439c5cb6615e 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -27,7 +27,31 @@ clean:
 	rm -f $(BINS) *.out
 
 run: $(BINS)
-	for bin in $(BINS); do echo "# $${bin} #"; "./$${bin}" test args; done
+	for bin in $(BINS); \
+	do
+		echo "# $${bin} #"; \
+		"./$${bin}" test args; \
+	done
+
+expected: $(BINS)
+	rm -rf expected
+	mkdir -p expected
+	for bin in $(BINS); \
+	do \
+		echo "# $${bin} #"; \
+		"./$${bin}" test args > "expected/$${bin}.stdout" 2> "expected/$${bin}.stderr"; \
+	done
+
+verify: $(BINS)
+	rm -rf gen
+	mkdir -p gen
+	for bin in $(BINS); \
+	do \
+		echo "# $${bin} #"; \
+		"./$${bin}" test args > "gen/$${bin}.stdout" 2> "gen/$${bin}.stderr"; \
+		diff -u "gen/$${bin}.stdout" "expected/$${bin}.stdout"; \
+		diff -u "gen/$${bin}.stderr" "expected/$${bin}.stderr"; \
+	done
 
 GCCHEAD=\
 	-nostdinc \
diff --git a/tests/expected/alloc.stderr b/tests/expected/alloc.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/alloc.stdout b/tests/expected/alloc.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..74753f94e3cfa3f1e9b0374f2f82e4dff032316f
--- /dev/null
+++ b/tests/expected/alloc.stdout
@@ -0,0 +1,2 @@
+malloc 0x55ac6c472618
+calloc 0x55ac6c472618
diff --git a/tests/expected/args.stderr b/tests/expected/args.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/args.stdout b/tests/expected/args.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..3b9ef538c3b9a209e24658fe4ef796b8983cc835
--- /dev/null
+++ b/tests/expected/args.stdout
@@ -0,0 +1 @@
+./args test args 
diff --git a/tests/expected/atof.stderr b/tests/expected/atof.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/atof.stdout b/tests/expected/atof.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..01e913dbfe725d2fdb0b96b99af47aed063f1792
--- /dev/null
+++ b/tests/expected/atof.stdout
@@ -0,0 +1 @@
+-3.14
diff --git a/tests/expected/atoi.stderr b/tests/expected/atoi.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/atoi.stdout b/tests/expected/atoi.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..d90e37cceac826425a16f83375fa2271261c4541
--- /dev/null
+++ b/tests/expected/atoi.stdout
@@ -0,0 +1,6 @@
+-42
+555
+1234567890
+-42
+555
+1234567890
diff --git a/tests/expected/brk.stderr b/tests/expected/brk.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/brk.stdout b/tests/expected/brk.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..c7e87198e01823db56563f4fe0fefe5b192dfb30
--- /dev/null
+++ b/tests/expected/brk.stdout
@@ -0,0 +1 @@
+brk exited with status code 0
diff --git a/tests/expected/chdir.stderr b/tests/expected/chdir.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/chdir.stdout b/tests/expected/chdir.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..6d79e11be0b87900d32ef232c49b0b99fc526f48
--- /dev/null
+++ b/tests/expected/chdir.stdout
@@ -0,0 +1,2 @@
+initial cwd: /home/jeremy/Projects/relibc/tests
+final cwd: /home/jeremy/Projects/relibc
diff --git a/tests/expected/create.stderr b/tests/expected/create.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/create.stdout b/tests/expected/create.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/ctype.stderr b/tests/expected/ctype.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/ctype.stdout b/tests/expected/ctype.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..e83b1e5f11ff31bed1bbfd1ab18e5f793a440275
--- /dev/null
+++ b/tests/expected/ctype.stdout
@@ -0,0 +1 @@
+Success: 0
diff --git a/tests/expected/dup.stderr b/tests/expected/dup.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/dup.stdout b/tests/expected/dup.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..20ec3fc2838660ac3a4dcb4428bd025b248e4fc5
--- /dev/null
+++ b/tests/expected/dup.stdout
@@ -0,0 +1 @@
+fd 4 duped into fd 5
diff --git a/tests/expected/error.stderr b/tests/expected/error.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..4eb19d82f37676f845b7b3a59a4991ce5a22996a
--- /dev/null
+++ b/tests/expected/error.stderr
@@ -0,0 +1 @@
+perror: No such file or directory
diff --git a/tests/expected/error.stdout b/tests/expected/error.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..f4ea5c920d19509171eff96610dc67881b4d6e04
--- /dev/null
+++ b/tests/expected/error.stdout
@@ -0,0 +1 @@
+errno: 2 = No such file or directory
diff --git a/tests/expected/fchdir.stderr b/tests/expected/fchdir.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/fchdir.stdout b/tests/expected/fchdir.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..4c110c289b34afe90d556803fc35c38e5967d250
--- /dev/null
+++ b/tests/expected/fchdir.stdout
@@ -0,0 +1 @@
+fchdir exited with status code 0
diff --git a/tests/expected/fcntl.stderr b/tests/expected/fcntl.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/fcntl.stdout b/tests/expected/fcntl.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..20ec3fc2838660ac3a4dcb4428bd025b248e4fc5
--- /dev/null
+++ b/tests/expected/fcntl.stdout
@@ -0,0 +1 @@
+fd 4 duped into fd 5
diff --git a/tests/expected/fsync.stderr b/tests/expected/fsync.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/fsync.stdout b/tests/expected/fsync.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..0b3deee6ecb6b6d14b65744dafc7e1fe7e4e7312
--- /dev/null
+++ b/tests/expected/fsync.stdout
@@ -0,0 +1 @@
+fsync exited with status code 0
diff --git a/tests/expected/ftruncate.stderr b/tests/expected/ftruncate.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/ftruncate.stdout b/tests/expected/ftruncate.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..5f0c8d705411b4e130d4da724c02e521b8f75927
--- /dev/null
+++ b/tests/expected/ftruncate.stdout
@@ -0,0 +1 @@
+ftruncate exited with status code 0
diff --git a/tests/expected/getid.stderr b/tests/expected/getid.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/getid.stdout b/tests/expected/getid.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..a51fd84a302264be258b90f328bf59ade1eacb18
--- /dev/null
+++ b/tests/expected/getid.stdout
@@ -0,0 +1 @@
+egid: 1000, euid: 1000, gid: 1000, pgid: 23916, pid: 23933, ppid 23918, uid 1000
diff --git a/tests/expected/link.stderr b/tests/expected/link.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/link.stdout b/tests/expected/link.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/math.stderr b/tests/expected/math.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/math.stdout b/tests/expected/math.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/pipe.stderr b/tests/expected/pipe.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/pipe.stdout b/tests/expected/pipe.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/printf.stderr b/tests/expected/printf.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/printf.stdout b/tests/expected/printf.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..ad30d8fbca48dc82518f2786cbb220d29dd075d3
--- /dev/null
+++ b/tests/expected/printf.stdout
@@ -0,0 +1,8 @@
+percent: %
+string: String
+char: c
+int: -16
+uint: 32
+hex: beef
+HEX: C0FFEE
+string: end
diff --git a/tests/expected/rmdir.stderr b/tests/expected/rmdir.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/rmdir.stdout b/tests/expected/rmdir.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..be0153a5a554b913c6bc7a1309b0d6eeed423649
--- /dev/null
+++ b/tests/expected/rmdir.stdout
@@ -0,0 +1 @@
+rmdir exited with status code 0
diff --git a/tests/expected/write.stderr b/tests/expected/write.stderr
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/tests/expected/write.stdout b/tests/expected/write.stdout
new file mode 100644
index 0000000000000000000000000000000000000000..980a0d5f19a64b4b30a87d4206aade58726b60e3
--- /dev/null
+++ b/tests/expected/write.stdout
@@ -0,0 +1 @@
+Hello World!