diff --git a/src/link.rs b/src/link.rs
index 577ed3d763c9f26ee89c7ded71df669b2bfcb2bb..04b749f7cf664473cf10d5fa40622f71236ddd3c 100644
--- a/src/link.rs
+++ b/src/link.rs
@@ -67,13 +67,10 @@ fn dump_sections<'s, T: Write>(
     Ok(output_size)
 }
 
+/// returns the number of bytes needed to align value
+/// on a given align size (must be a power of 2)
 fn align(value: usize, align: usize) -> usize {
-    let a = value & (align - 1);
-    if a == 0 {
-        0
-    } else {
-        align - a
-    }
+    (value + (align - 1) & !(align - 1)) - value
 }
 
 pub fn link(opts: Opts) -> Result<()> {