As discussed in IRC:

Without `static` to limit the scope of the variable, the global variable `dev` is overlapping with another global variable (also called `dev`) in pios_hmc5883.c.

````
$ ./tools/gcc-arm-none-eabi-4_6-2012q4/bin/arm-none-eabi-gdb ./build/fw_freedom/fw_freedom.elf
(gdb) p & dev
$1 = (struct hmc5883_dev **) 0x20003784
````
Already suspicious.  `dev` is seemingly the wrong type.

````
(gdb) disassemble /m PIOS_MS5611_StartADC
Dump of assembler code for function PIOS_MS5611_StartADC:
180	{
   0x0803ce78 <+0>:	push	{r3, r4, r5, lr}
   0x0803ce7c <+4>:	mov	r4, r0

181		if (PIOS_MS5611_Validate(dev) != 0)
   0x0803ce7a <+2>:	ldr	r5, [pc, #80]	; (0x803cecc <PIOS_MS5611_StartADC+84>)
   0x0803ce7e <+6>:	ldr	r0, [r5, #0]
   0x0803ce80 <+8>:	bl	0x803ce08 <PIOS_MS5611_Validate>
````

Note that this code loads dev from `[pc, #80]` and passes it to Validate()
Now let's see what's in `[pc, #80]`...

````
(gdb) x/1x 0x803cecc
0x803cecc <PIOS_MS5611_StartADC+84>:	0x20003784
````
And compare this to `& dev` from above.  Both of them are 0x20003784.

Adding these linker flags will warn for duplicate common (ie global) symbols and make it a link error:
````
LDFLAGS += -Wl,--warn-common
LDFLAGS += -Wl,--fatal-warnings
````

Now we get this error at link time:
````
 LD          build/fw_freedom/fw_freedom.elf
/home/ssheldon/pp/PhoenixPilot/build/fw_freedom/insgps13state.o: warning: multiple common of `Nav'
/home/ssheldon/pp/PhoenixPilot/build/fw_freedom/attitude.o: warning: previous common is here
/home/ssheldon/pp/PhoenixPilot/build/fw_freedom/pios_ms5611.o: warning: multiple common of `dev'
/home/ssheldon/pp/PhoenixPilot/build/fw_freedom/pios_hmc5883.o: warning: previous common is here
collect2: ld returned 1 exit status
make[1]: *** [/home/ssheldon/pp/PhoenixPilot/build/fw_freedom/fw_freedom.elf] Error 1
make: *** [fw_freedom_opfw] Error 2
````

**Note** this also points out an issue with `Nav` in a couple other modules.