Nick Meyer's answer is correct for Windows and AIX, but is unlikely to be correct on all other UNIX platforms by default.
On most UNIX platforms, the runtime loader supports a single namespace for all characters, so if you define foo_helper in a.out as well as plugin.so and then call foo_helper from one, the first definition is visible to the runtime loader (usually this from a.out ), used by default for both calls.
In addition, the image is complicated by the fact that foo_helper cannot be exported from a.out (and therefore may not be visible to the loader at runtime) unless you use the -rdynamic flag or some other links to the This shared library. In other words, it might seem like everything works as Nick described them, then you add a shared library to the a.out link line and they no longer work like that.
On ELF platforms (like Linux) you have great control over visibility and character binding. See the Description of -fvisibility=hidden and -rdynamic in the GCC manual page, and -Bsymbolic on the link builder page.
Most other UNIX platforms have some way of managing character bindings, but this is necessarily platform dependent.
Employed Russian
source share