If you clicked on this because you thought that this can't be possible, I thought the same thing until I ran into it.
I was working on a project, written in C for a PIC, that is built with a Makefile. The Makefile was very disorganized, so I wanted to clean it up. To make sure I didn't break anything while I did it, I recorded the hashes of all the files following a fresh make: (No subdirectories in this project. Built with SDCC and GPUTILS.)
make clean
make
md5sum ./* > ../allsums.txt
Then I modified the Makefile and tried again, this time comparing the resulting files to allsums.txt.
make clean
vim Makefile
make
md5sum -c ../allsums.txt
Interestingly, the hashes of the .o files did not match, but the end result did. Assuming that the problem to be one I created somehow, I spent a lot of time trying to hunt it down.
Then, on a hunch, I did this using the original Makefile:
make clean
make
md5sum ./* > ../allsums.txt
make clean
make
md5sum -c ../allsums.txt
I found that the object files changed here, too! Some searching lead me to this question, which confirmed that (at least for gcc) the .o files change between each compilation.
What causes this?