I've noticed a difference in my odometer, speedometer and GPS readings too. I think I trust the GPS more than the one in the truck. An odometer is a geared train reduced in speed to give a numerical readout, and is a reflection of how many times the rear output shaft of the transmission goes around. I know there are different ways it can work, but most do this way. You can get an error in this by having different tire sizes than what it was calibrated for. You can also get error by having the rear wheels slip as on snow or driving through sand. The wheels turn, showing miles traveled, but you don't move. There is also a bit of error in the design. The speedometer output gear ratio needed to make exactly the right output for the rear end ratio and tire size almost never comes out exactly to a whole number, so the manufacturer has to pick a certain number of teeth on the gear to get it as close as possible. On my truck it is the small plastic gear located on the end of the speedometer cable going into the transmission.
The speedometer dial is driven by a rotating magnet at the base of the pointer. This little cup of aluminum is connected by the magnetic field in the magnet which generates a small electric current in the cup, which then generates a magnetic field that tries to follow the other magnet. The dial is held back by a fine spring and if it's not adjusted it will be off, even if the odometer is right on.
Check you own speed with a good digital watch, and the mile markers on the road. You divide the number of seconds it takes you to go a mile into 3600 and you will have your average speed over that mile. There are 3600 hundred seconds in an hour, so if you travel a mile in 60 seconds, you are going 3600/60= 60 mph