Well, many MBytes of your binary are Lazarus' units, linked to your program at compile time. So your source is small, but it uses many functions, procedures and objects from additional units. It is normal thing, that executable file is much bigger than it's source.