Check section 2.11 of the OpenGL 4.2 specification:
The executable code for an individual shader stage is taken from the current program for that stage. If there is a current program object established by UseProgram, that program is considered current for all stages. Otherwise, if there is a bound program pipeline object (see section 2.11.4), the program bound to the appropriate stage of the pipeline object is considered current. If there is no current program object or bound program pipeline object, no program is current for any stage. The current program for a stage is considered active if it contains executable code for that stage; otherwise, no program is considered active for that stage. If there is no active program for the vertex or fragment shader stages, the results of vertex and/or fragment processing will be undefined. However, this is not an error. If there is no active program for the tessellation control, tessellation evaluation, or geometry shader stages, those stages are ignored.
This is "undefined behavior" that acts differently per implementation.
As for the solution to not being able to find a shader, I've found it's best to hardcode both a vertex and fragment shader and load them before anything else, then use it in place of any missing shaders. That way a lot of the uniforms I define (transformation matrices) will still go through and the result will look half-decent. For example, here's how I do it (C#):
string[]string defaultVertShaderText = new string[] { "#version@"#version 120",120 "attributeattribute vec4 in_vertex;",in_vertex; "uniformuniform mat4 model;",model; "uniformuniform mat4 view;",view; "uniformuniform mat4 projection;",projection; "voidvoid main()", "{", "gl_Positiongl_Position = projection * view * model * in_vertex;",in_vertex; "}", };"; string[]string defaultFragShaderText = new string[] { "#version@"#version 120",120 "voidvoid main()", "{", "gl_FragColorgl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);",; "}" };"; Also hardcoding a default texture is a good idea.