What constitutes combining two parts into one program? This is a
legal question, which ultimately judges will decide. We believe that
a proper criterion depends both on the mechanism of communication
(exec, pipes, rpc, function calls within a shared address space,
etc.) and the semantics of the communication (what kinds of
information are interchanged).
If the modules are included in the same executable file, they are
definitely combined in one program. If modules are designed to run
linked together in a shared address space, that almost surely means
combining them into one program.
By contrast, pipes, sockets and command-line arguments are
communication mechanisms normally used between two separate programs.
So when they are used for communication, the modules normally are
separate programs. But if the semantics of the communication are
intimate enough, exchanging complex internal data structures, that
too could be a basis to consider the two parts as combined into a
larger program.
If the program uses fork and exec to invoke plug-ins, then the
plug-ins are separate programs, so the license for the main program
makes no requirements for them. So you can use the GPL for a plug-in,
and there are no special requirements.
If the program dynamically links plug-ins, and they make function
calls to each other and share data structures, we believe they form a
single program, which must be treated as an extension of both the
main program and the plug-ins. This means that combination of the
GPL-covered plug-in with the non-free main program would violate the
GPL. However, you can resolve that legal problem by adding an
exception to your plug-in's license, giving permission to link it
with the non-free main program.