The outputs of the verrtex shader ar inputs to the geometry shader and the outputs of the geoemtry shader are inputs to the fragment shader.
Thei inputs to the geometry shader will be an array of the length of the primitive's vertex count. (See Geometry Shader - Inputs).
This means you have to declare an input array and an output in the geometry shader:
in vec3 normal[];
out vec3 geo_normal;
Pass the input to the output:
geo_normal = normal[i];
EmitVertex();
Declare an input in the fragment shader:
in vec3 geo_normal;
An option would be to use
Layout Qualifiers
Geometry shader:
in vec3 normal[]; // <---- array
out layout(location=1) vec3 geo_normal;
geo_normal = normal[i];
EmitVertex();
Fragment shader:
in layout(location=1) vec3 normal; // link by layout location 1 and not by name
Another option would be to use
Interface Blocks:
Vertex shader:
out TData
{
vec3 normal;
} outData;
outData.normal = .....;
Geometry shader:
in TData
{
vec3 normal;
} inData[]; // <---- array
out TData
{
vec3 normal;
} outData;
outData.normal = inData.normal[i];
EmitVertex();
Fragment shader:
in TData
{
vec3 normal;
} inData;
..... = inData.normal;