Within the kernel proper, the normal linking rules apply (ie. unless a symbol is declared to be file scope with the `static' keyword, it can be used anywhere in the kernel). However, for modules, a special exported symbol table is kept which limits the entry points to the kernel proper. Modules can also export symbols.
This is the classic method of exporting a symbol, and it works for both modules and non-modules. In the kernel all these declarations are bundled into a single file to help genksyms (which searches source files for these declarations).
For convenience, a module usually exports all non-file-scope symbols (ie. all those not declared `static'). If this is defined before `module.h' is included, then only symbols explicit exported with `EXPORT_SYMBOL()' will be exported.