diff --git a/check.py b/check.py
index 2171a33..b1d52b9 100755
--- a/check.py
+++ b/check.py
@@ -156,6 +156,31 @@
               fail_with_error('wasm interpreter error: ' + err) # failed to pretty-print
             fail_with_error('wasm interpreter error')
 
+        # verify debug info
+        if 'debugInfo' in asm:
+          txtmap = 'a.wasm.txtmap'
+          cmd += ['--binarymap-file', txtmap,
+                  '--binarymap-url', txtmap + '.map',
+                  '-o', 'a.wasm']
+          run_command(cmd)
+          if not os.path.isfile(txtmap):
+            fail_with_error('Debug info map not created: %s' % txtmap)
+          with open(wasm + '.txtmap', 'rb') as expected:
+            with open(txtmap, 'rb') as actual:
+              fail_if_not_identical(actual.read(), expected.read())
+          with open('a.wasm', 'rb') as binary:
+            url_section_name = bytearray([16]) + bytearray('sourceMappingURL')
+            payload = txtmap + '.map'
+            assert len(payload) < 256, 'name too long'
+            url_section_contents = bytearray([len(payload)]) + bytearray(payload)
+            print url_section_name
+            binary_contents = bytearray(binary.read())
+            if url_section_name not in binary_contents:
+              fail_with_error('source map url section not found in binary')
+            if url_section_contents not in binary_contents[binary_contents.index(url_section_name):]:
+              fail_with_error('source map url not found in url section')
+
+
 print '\n[ checking asm2wasm binary reading/writing... ]\n'
 
 asmjs = os.path.join(options.binaryen_test, 'hello_world.asm.js')
diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp
index 9f0d0e4..ebc88bf 100644
--- a/src/tools/asm2wasm.cpp
+++ b/src/tools/asm2wasm.cpp
@@ -36,6 +36,8 @@
   Asm2WasmBuilder::TrapMode trapMode = Asm2WasmBuilder::TrapMode::JS;
   bool wasmOnly = false;
   bool debugInfo = false;
+  std::string binaryMapFile;
+  std::string binaryMapUrl;
   std::string symbolMap;
   bool emitBinary = true;
 
@@ -96,9 +98,15 @@
            [&wasmOnly](Options *o, const std::string &) {
              wasmOnly = true;
            })
-      .add("--debuginfo", "-g", "Emit names section and debug info (for debug info you must emit text, -S, for this to work)",
+      .add("--debuginfo", "-g", "Emit names section in wasm binary (or full debuginfo in wast)",
            Options::Arguments::Zero,
            [&](Options *o, const std::string &arguments) { debugInfo = true; })
+      .add("--binarymap-file", "-bm", "Emit binary map (if using binary output) to the specified file",
+           Options::Arguments::One,
+           [&binaryMapFile](Options *o, const std::string &argument) { binaryMapFile = argument; })
+      .add("--binarymap-url", "-bu", "Use specified string as binary map URL",
+           Options::Arguments::One,
+           [&binaryMapUrl](Options *o, const std::string &argument) { binaryMapUrl = argument; })
       .add("--symbolmap", "-s", "Emit a symbol map (indexes => names)",
            Options::Arguments::One,
            [&](Options *o, const std::string &argument) { symbolMap = argument; })
@@ -127,7 +135,6 @@
   }
 
   Asm2WasmPreProcessor pre;
-  // wasm binaries can contain a names section, but not full debug info
   pre.debugInfo = debugInfo;
   auto input(
       read_file<std::vector<char>>(options.extra["infile"], Flags::Text, options.debug ? Flags::Debug : Flags::Release));
@@ -191,7 +198,11 @@
   writer.setDebugInfo(debugInfo);
   writer.setSymbolMap(symbolMap);
   writer.setBinary(emitBinary);
-  writer.write(wasm, options.extra["output"]);
+  if (emitBinary && binaryMapFile.size()) {
+    writer.writeBinary(wasm, options.extra["output"], binaryMapFile, binaryMapUrl);
+  } else {
+    writer.write(wasm, options.extra["output"]);
+  }
 
   if (options.debug) std::cerr << "done." << std::endl;
 }
diff --git a/src/tools/wasm-as.cpp b/src/tools/wasm-as.cpp
index 067c0f2..5bdf74b 100644
--- a/src/tools/wasm-as.cpp
+++ b/src/tools/wasm-as.cpp
@@ -86,7 +86,7 @@
   if (options.debug) std::cerr << "binarification..." << std::endl;
   BufferWithRandomAccess buffer(options.debug);
   WasmBinaryWriter writer(&wasm, buffer, options.debug);
-  writer.setDebugInfo(debugInfo);
+  writer.setNamesSection(debugInfo);
   if (symbolMap.size() > 0) writer.setSymbolMap(symbolMap);
   writer.write();
 
diff --git a/src/wasm-binary.h b/src/wasm-binary.h
index ec45f24..ee0a8de 100644
--- a/src/wasm-binary.h
+++ b/src/wasm-binary.h
@@ -303,6 +303,7 @@
 
 namespace UserSections {
 extern const char* Name;
+extern const char* SourceMapUrl;
 
 enum Subsection {
   NameFunction = 1,
@@ -532,6 +533,8 @@
   Function* currFunction = nullptr;
   bool debug;
   bool debugInfo = true;
+  std::ostream* binaryMap = nullptr;
+  std::string binaryMapUrl;
   std::string symbolMap;
 
   MixedArena allocator;
@@ -542,7 +545,11 @@
     prepare();
   }
 
-  void setDebugInfo(bool set) { debugInfo = set; }
+  void setNamesSection(bool set) { debugInfo = set; }
+  void setBinaryMap(std::ostream* set, std::string url) {
+    binaryMap = set;
+    binaryMapUrl = url;
+  }
   void setSymbolMap(std::string set) { symbolMap = set; }
 
   void write();
@@ -578,6 +585,7 @@
   void writeFunctionTableDeclaration();
   void writeTableElements();
   void writeNames();
+  void writeSourceMapUrl();
   void writeSymbolMap();
 
   // helpers
@@ -604,13 +612,13 @@
   std::vector<Name> breakStack;
 
   void visit(Expression* curr) {
-    if (debugInfo && currFunction) {
-      // show an annotation, if there is one
+    if (binaryMap && currFunction) {
+      // Dump the binaryMap debug info
       auto& debugLocations = currFunction->debugLocations;
       auto iter = debugLocations.find(curr);
       if (iter != debugLocations.end()) {
         auto fileName = wasm->debugInfoFileNames[iter->second.fileIndex];
-        std::cout << std::hex <<o.size() << ":" << fileName << ":" << std::dec <<iter->second.lineNumber << '\n';
+        *binaryMap << o.size() << ":" << fileName << ":" <<iter->second.lineNumber << '\n';
       }
     }
     Visitor<WasmBinaryWriter>::visit(curr);
diff --git a/src/wasm-io.h b/src/wasm-io.h
index 7d7358f..eb644ba 100644
--- a/src/wasm-io.h
+++ b/src/wasm-io.h
@@ -56,7 +56,9 @@
   // write text
   void writeText(Module& wasm, std::string filename);
   // write binary
-  void writeBinary(Module& wasm, std::string filename);
+  void writeBinary(Module& wasm, std::string filename,
+                   std::string binaryMapFilename,
+                   std::string binaryMapUrl);
   // write text or binary, defaulting to binary unless setBinary(false),
   // and unless there is no output file (in which case we write text
   // to stdout).
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp
index 9a3c026..d8a3d99 100644
--- a/src/wasm/wasm-binary.cpp
+++ b/src/wasm/wasm-binary.cpp
@@ -46,6 +46,7 @@
   writeFunctions();
   writeDataSegments();
   if (debugInfo) writeNames();
+  if (binaryMap) writeSourceMapUrl();
   if (symbolMap.size() > 0) writeSymbolMap();
 
   finishUp();
@@ -422,6 +423,14 @@
   finishSection(start);
 }
 
+void WasmBinaryWriter::writeSourceMapUrl() {
+  if (debug) std::cerr << "== writeSourceMapUrl" << std::endl;
+  auto start = startSection(BinaryConsts::Section::User);
+  writeInlineString(BinaryConsts::UserSections::SourceMapUrl);
+  writeInlineString(binaryMapUrl.c_str());
+  finishSection(start);
+}
+
 void WasmBinaryWriter::writeSymbolMap() {
   std::ofstream file(symbolMap);
   for (auto& import : wasm->imports) {
diff --git a/src/wasm/wasm-io.cpp b/src/wasm/wasm-io.cpp
index c3192ef..3366d5e 100644
--- a/src/wasm/wasm-io.cpp
+++ b/src/wasm/wasm-io.cpp
@@ -68,24 +68,35 @@
   WasmPrinter::printModule(&wasm, output.getStream());
 }
 
-void ModuleWriter::writeBinary(Module& wasm, std::string filename) {
+void ModuleWriter::writeBinary(Module& wasm, std::string filename,
+                               std::string binaryMapFilename,
+                               std::string binaryMapUrl) {
   if (debug) std::cerr << "writing binary to " << filename << "\n";
   BufferWithRandomAccess buffer(debug);
   WasmBinaryWriter writer(&wasm, buffer, debug);
-  writer.setDebugInfo(debugInfo);
+  writer.setNamesSection(debugInfo);
+  std::ofstream* binaryMapStream = nullptr;
+  if (binaryMapFilename.size()) {
+    binaryMapStream = new std::ofstream;
+    binaryMapStream->open(binaryMapFilename);
+    writer.setBinaryMap(binaryMapStream, binaryMapUrl);
+  }
   if (symbolMap.size() > 0) writer.setSymbolMap(symbolMap);
   writer.write();
   Output output(filename, Flags::Binary, debug ? Flags::Debug : Flags::Release);
   buffer.writeTo(output);
+  if (binaryMapStream) {
+    binaryMapStream->close();
+    delete binaryMapStream;
+  }
 }
 
 void ModuleWriter::write(Module& wasm, std::string filename) {
   if (binary && filename.size() > 0) {
-    writeBinary(wasm, filename);
+    writeBinary(wasm, filename, std::string(), std::string());
   } else {
     writeText(wasm, filename);
   }
 }
 
 }
-
diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp
index a983fc9..dce9096 100644
--- a/src/wasm/wasm.cpp
+++ b/src/wasm/wasm.cpp
@@ -28,6 +28,7 @@
 namespace BinaryConsts {
 namespace UserSections {
 const char* Name = "name";
+const char* SourceMapUrl = "sourceMappingURL";
 }
 }
 
diff --git a/test/debugInfo.fromasm.clamp.no-opts.txtmap b/test/debugInfo.fromasm.clamp.no-opts.txtmap
new file mode 100644
index 0000000..eec2e7b
--- /dev/null
+++ b/test/debugInfo.fromasm.clamp.no-opts.txtmap
@@ -0,0 +1,8 @@
+164:tests/hello_world.c:5
+168:tests/hello_world.c:6
+172:tests/other_file.cpp:314159
+194:return.cpp:50
+201:return.cpp:100
+241:even-opted.cpp:1
+248:even-opted.cpp:2
+255:even-opted.cpp:3
diff --git a/test/debugInfo.fromasm.clamp.txtmap b/test/debugInfo.fromasm.clamp.txtmap
new file mode 100644
index 0000000..bb25b4d
--- /dev/null
+++ b/test/debugInfo.fromasm.clamp.txtmap
@@ -0,0 +1,2 @@
+211:even-opted.cpp:2
+223:even-opted.cpp:3
diff --git a/test/debugInfo.fromasm.imprecise.no-opts.txtmap b/test/debugInfo.fromasm.imprecise.no-opts.txtmap
new file mode 100644
index 0000000..00a07f1
--- /dev/null
+++ b/test/debugInfo.fromasm.imprecise.no-opts.txtmap
@@ -0,0 +1,8 @@
+163:tests/hello_world.c:5
+167:tests/hello_world.c:6
+171:tests/other_file.cpp:314159
+193:return.cpp:50
+200:return.cpp:100
+219:even-opted.cpp:1
+226:even-opted.cpp:2
+233:even-opted.cpp:3
diff --git a/test/debugInfo.fromasm.imprecise.txtmap b/test/debugInfo.fromasm.imprecise.txtmap
new file mode 100644
index 0000000..c9f177c
--- /dev/null
+++ b/test/debugInfo.fromasm.imprecise.txtmap
@@ -0,0 +1 @@
+190:even-opted.cpp:2
diff --git a/test/debugInfo.fromasm.no-opts.txtmap b/test/debugInfo.fromasm.no-opts.txtmap
new file mode 100644
index 0000000..eec2e7b
--- /dev/null
+++ b/test/debugInfo.fromasm.no-opts.txtmap
@@ -0,0 +1,8 @@
+164:tests/hello_world.c:5
+168:tests/hello_world.c:6
+172:tests/other_file.cpp:314159
+194:return.cpp:50
+201:return.cpp:100
+241:even-opted.cpp:1
+248:even-opted.cpp:2
+255:even-opted.cpp:3
diff --git a/test/debugInfo.fromasm.txtmap b/test/debugInfo.fromasm.txtmap
new file mode 100644
index 0000000..bb25b4d
--- /dev/null
+++ b/test/debugInfo.fromasm.txtmap
@@ -0,0 +1,2 @@
+211:even-opted.cpp:2
+223:even-opted.cpp:3
