My embedded Rust program is too big!
diff --git a/src/unsorted/faq.md b/src/unsorted/faq.md
index 3c6e5e9..fa08b67 100644
--- a/src/unsorted/faq.md
+++ b/src/unsorted/faq.md
@@ -3,6 +3,7 @@
 - [Does Rust support my device?](#does-rust-support-my-device)
 - [(When) will Rust support AVR?](#when-will-rust-support-the-avr-architecture)
 - [(When) will Rust support Xtensa?](#when-will-rust-support-the-xtensa-architecture)
+- [My embedded Rust program is too big!](#my-embedded-rust-program-is-too-big)
 
 ## Does Rust support my device?
 
@@ -207,3 +208,67 @@
 TL;DR `rustc` will support the Xtensa architecture when the official LLVM gains
 support for the Xtensa architecture. As LLVM is a project independent of the
 Rust project we can't give you any estimate on when that might happen.
+
+## My embedded Rust program is too big!
+
+We sometimes get questions like this one: "My Rust program is 500 KB but my
+microcontroller only has 16 KB of Flash; how can I make it fit?".
+
+The first thing to confirm is that correctly measuring the size of your program.
+`rustc` produces ELF files for most embedded targets. ELF files have metadata
+and contain debug information so measuring their size on disk with e.g. `ls -l`
+will give you the wrong number.
+
+``` console
+$ # 500 KB?
+$ ls -hl target/thumbv7m-none-eabi/debug/app
+-rwxr-xr-x 2 japaric japaric 554K Sep 19 13:37 target/thumbv7m-none-eabi/debug/app
+```
+
+The correct way to measure the size of an embedded program is to use the `size`
+program or the [`cargo size`] subcommand.
+
+[`cargo size`]: https://github.com/rust-embedded/cargo-binutils
+
+``` console
+$ # ~ 2 KB of Flash
+$ cargo size --bin app -- -A
+    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
+app  :
+section               size        addr
+.vector_table         1024   0x8000000
+.text                  776   0x8000400
+.rodata                208   0x8000708
+.data                    0  0x20000000
+.bss                     0  0x20000000
+.debug_str          145354         0x0
+.debug_abbrev        11264         0x0
+.debug_info         139259         0x0
+.debug_macinfo          33         0x0
+.debug_pubnames      40901         0x0
+.debug_pubtypes      14326         0x0
+.ARM.attributes         50         0x0
+.debug_frame         21224         0x0
+.debug_line         117666         0x0
+.debug_ranges        63800         0x0
+.comment                75         0x0
+Total               555960
+```
+
+Of the standard sections, `.text`, `.rodata` and `.data` will occupy Flash /
+ROM; `.bss` and `.data` will occupy RAM; `.debug_*`, `.ARM.attributes` and
+`.comments` can be ignored as they won't be loaded into the target device
+memory. For the other sections you'll have to check your dependencies' docs.
+
+In this examples the program will occupy `2008` bytes of Flash.
+
+Note that most (all?) runtime crates, like `cortex-m-rt`, will check at link
+time that the program fits in the target device memory. If it doesn't fit you'll
+get a linker error and no output binary. So, provided that you correctly entered
+the size of the memory regions of your device then if it links it should fit in
+the target device!
+
+If you are measuring size using the right method and your program is still too
+big then check out our section on optimizations.
+
+> **TODO** add link to the optimizations section