The tiny FAT file system emulation in the bootloader uses a fixed translation from FAT cluster number to flash address. Once the old firmware has been deleted in the file browser (e.g Windows Explorer) on the host, all clusters are available for following write operations. Windows use them sequentially starting at the first available cluster. However, Linux starts at the second cluster, and this leads to the code ending up at the wrong location (here: 1 KB shifted, since a cluster contains two file system sectors of 512 bytes).
Both Windows and Linux do it perfectly right, because they can use clusters in any sequence they like. However, since the bootloader is translating the cluster no directly into Flash sector no, it may not working with different OS, other than Windows.