diff --git a/src/target/target.c b/src/target/target.c
index 11b12e5e84d4c20eb4e97dd1900571e09bdc5350..1ea1a61668c9d059299e6225778138ba92b2f8c8 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -3387,7 +3387,11 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
 			max = samples[i];
 	}
 
-	int addressSpace = (max - min + 1);
+	/* max should be (largest sample + 1)
+	 * Refer to binutils/gprof/hist.c (find_histogram_for_pc) */
+	max++;
+
+	int addressSpace = max - min;
 	assert(addressSpace >= 2);
 
 	static const uint32_t maxBuckets = 16 * 1024; /* maximum buckets. */
@@ -3403,8 +3407,8 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
 	for (i = 0; i < sampleNum; i++) {
 		uint32_t address = samples[i];
 		long long a = address - min;
-		long long b = numBuckets - 1;
-		long long c = addressSpace - 1;
+		long long b = numBuckets;
+		long long c = addressSpace;
 		int index_t = (a * b) / c; /* danger!!!! int32 overflows */
 		buckets[index_t]++;
 	}