Simple question:
In GLSL, is there a way to share functions across multiple shaders, or do I have to define all functions in every shader that needs them?
You can define some functions in a header file and #include them into your shader. It's a bit different from C/C++ in that you'd put the bodies of your functions in the headers, not just their prototypes (since shaders have no concept of separate compilation & linking), but other than that it's just like C/C++ headers.
If #include is not available you would use the arguments of glShaderSource to specify the shared stuff. Example:
char *sharedcode = "...shared code here...";
char *fs1 = "...fragment shader 1...";
char *fs2 = "...fragment shader 2...";
char *awesomeeffect1[] = {sharedcode, fs1};
char *awesomeeffect2[] = {sharedcode, fs2};
glShaderSource (shader1, 2, awesomeeffect1, NULL);
glShaderSource (shader2, 2, awesomeeffect2, NULL);