diff --git a/Makefile.am b/Makefile.am
index 1bc1077ebb84e5609a66b1e91cf6fad55b275c81..0361d87cec22cfc942d7cb50ad3ee81b9ad47346 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -71,6 +71,9 @@ test: all
 test-network: all
 	./src/test/test-network.sh
 
+reset-gcov:
+	rm -f src/*/*.gcda
+
 # Avoid strlcpy.c, strlcat.c, aes.c, OpenBSD_malloc_Linux.c, sha256.c,
 # eventdns.[hc], tinytest*.[ch]
 check-spaces:
diff --git a/changes/bug9267 b/changes/bug9267
new file mode 100644
index 0000000000000000000000000000000000000000..95a621148d7292d5ec3a25a1a99e8990da8ac938
--- /dev/null
+++ b/changes/bug9267
@@ -0,0 +1,4 @@
+  o Minor bugfixes:
+    - Added optional parameter to contrib/coverage script to specify directory
+      to put gcov files in, and added reset-gcov target to top-level makefile.
+      Fixes bug #9267.
diff --git a/contrib/coverage b/contrib/coverage
index f51649a78ecc6c8fefb2e3290381de04e3cef6af..8d971660c9a15878f0ef18a7bfb158b005a0c336 100755
--- a/contrib/coverage
+++ b/contrib/coverage
@@ -5,9 +5,16 @@
 # coverage -- run gcov on the appropriate set of object files to extract
 # coverage information.
 
+dst=$1
+
 for fn in src/or/*.c src/common/*.c; do
     BN=`basename $fn`
     DN=`dirname $fn`
     F=`echo $BN | sed -e 's/\.c$//;'`
+    GC="${BN}.gcov"
     gcov -o $DN/src_*$F.o $fn
+    if [ -n $dst ]
+    then
+      mv $GC $dst/$GC
+    fi
 done