dynamic linking will make use of existing libraries. for example if the definition of sin() is in libmath the program will use the libmath on your computer and not include the definition in it self. thus the program is smaller. however if something is corrupted/damaged with libmath your program will not be able to use that function.

static linking takes the definition of sin() out of libmath and inserts it into your program so that no matter if libmath is deleted or damaged your program will have that definition in itself and is not affected. thus the program is bigger.

static linking is more used for "mission-critical" programs where one would not need to worry about the version of the library on your system or it's location. dynamic linking is the opposite.

make sure you do not violate copyright laws with static linking. for example if a library is created and licensed under the LGPL and you are creating a proprietary/closed program (ewwwww...) you cannot static link because that would take the LGPL'ed code and insert it into the closed application...

man gcc should give you everything you need.

hope this helps.