diff --git a/test/core/echo/echo_test.c b/test/core/echo/echo_test.c
index 6449b2414f39f5aefc44934f217191afb7b85b5a..83b83ab7ff774c8359ef86122478479bae88ae3a 100644
--- a/test/core/echo/echo_test.c
+++ b/test/core/echo/echo_test.c
@@ -49,18 +49,19 @@
 #include "test/core/util/port.h"
 
 int test_client(const char *root, const char *host, int port) {
-  char *args[3];
   int status;
   pid_t cli;
   cli = fork();
   if (cli == 0) {
-    gpr_asprintf(&args[0], "%s/echo_client", root);
-    gpr_join_host_port(&args[1], host, port);
-    args[2] = 0;
-    execv(args[0], args);
+    char *binary_path;
+    char *binding;
+    gpr_asprintf(&binary_path, "%s/echo_client", root);
+    gpr_join_host_port(&binding, host, port);
 
-    gpr_free(args[0]);
-    gpr_free(args[1]);
+    execl(binary_path, binary_path, binding, NULL);
+
+    gpr_free(binary_path);
+    gpr_free(binding);
     return 1;
   }
   /* wait for client */
@@ -76,7 +77,6 @@ int main(int argc, char **argv) {
   char *lslash = strrchr(me, '/');
   char root[1024];
   int port = grpc_pick_unused_port_or_die();
-  char *args[3];
   int status;
   pid_t svr;
   int ret;
@@ -98,13 +98,15 @@ int main(int argc, char **argv) {
   /* start the server */
   svr = fork();
   if (svr == 0) {
-    gpr_asprintf(&args[0], "%s/echo_server", root);
-    gpr_join_host_port(&args[1], "::", port);
-    args[2] = 0;
-    execv(args[0], args);
+    char *binary_path;
+    char *binding;
+    gpr_asprintf(&binary_path, "%s/echo_server", root);
+    gpr_join_host_port(&binding, "::", port);
+
+    execl(binary_path, binary_path, "-bind", binding, NULL);
 
-    gpr_free(args[0]);
-    gpr_free(args[1]);
+    gpr_free(binary_path);
+    gpr_free(binding);
     return 1;
   }
   /* wait a little */