As far as I know it (and I write this from memory to give a general picture, research for details)
On Linux, all symbols are in a single linker namespace (symbol table), binary and library.
On windows, but also commercial Unixes like OS X, every module (binary or library) has its own linker namespace. IOW to find a symbol you must always pass something identifying the module (dll/.so/.dyliblibrary) as well as the symbol name.
When _statically_ linking a dynamic library, an import lib is generated that has something like this
_stat:
jmp $0 // this value is relocated by the loader with the address of the function in the DLL
some info or references to a table here, so that the dyn linker can find symbol name etc.
in this case you cal _stat
When dynamically linking, the DLL is loaded into your process space, and you must use dlsym/
getprocaddress to get a pointer to the code. Note that getprocaddress has two arguments, module handle and symbol name
p.s. good reading: the free "Linkers and Loaders" book from John Irvine