I created a simple opengl file in cpp. It works on the University computer. I'm able to compile the file, but i can not run the compiled file. The error I get is:
Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed!
the file code is:
//
// Model.cpp
// cg-projects
//
// Created by HUJI Computer Graphics course staff, 2013.
//
#include "ShaderIO.h"
#include "Model.h"
#include <GL/glew.h>
#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#else
#include <GL/gl.h>
#endif
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include "glm/gtc/matrix_transform.hpp"
#define SHADERS_DIR "shaders/"
Model::Model() :
_vao(0), _vbo(0)
{
}
Model::~Model()
{
if (_vao != 0)
glDeleteVertexArrays(1, &_vao);
if (_vbo != 0)
glDeleteBuffers(1, &_vbo);
}
void Model::init()
{
programManager::sharedInstance()
.createProgram("default",
SHADERS_DIR "SimpleShader.vert",
SHADERS_DIR "SimpleShader.frag");
GLuint program = programManager::sharedInstance().programWithID("default");
// Obtain uniform variable handles:
_fillColorUV = glGetUniformLocation(program, "fillColor");
// Initialize vertices buffer and transfer it to OpenGL
{
// For this example we create a single triangle:
const float vertices[] = {
0.75f, 0.75f, 0.0f, 1.0f,
0.75f, -0.75f, 0.0f, 1.0f,
-0.75f, -0.75f, 0.0f, 1.0f,
};
// Create and bind the object's Vertex Array Object:
glGenVertexArrays(1, &_vao);
glBindVertexArray(_vao);
// Create and load vertex data into a Vertex Buffer Object:
glGenBuffers(1, &_vbo);
glBindBuffer(GL_ARRAY_BUFFER, _vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// Tells OpenGL that there is vertex data in this buffer object and what form that vertex data takes:
// Obtain attribute handles:
_posAttrib = glGetAttribLocation(program, "position");
glEnableVertexAttribArray(_posAttrib);
glVertexAttribPointer(_posAttrib, // attribute handle
4, // number of scalars per vertex
GL_FLOAT, // scalar type
GL_FALSE,
0,
0);
// Unbind vertex array:
glBindVertexArray(0);
}
}
void Model::draw()
{
// Set the program to be used in subsequent lines:
GLuint program = programManager::sharedInstance().programWithID("default");
glUseProgram(program);
GLenum polygonMode = GL_LINE; // Also try using GL_FILL and GL_POINT
glPolygonMode(GL_FRONT_AND_BACK, polygonMode);
// Set uniform variable with RGB values:
float red = 0.3f; float green = 0.5f; float blue = 0.7f;
glUniform4f(_fillColorUV, red, green, blue, 1.0);
// Draw using the state stored in the Vertex Array object:
glBindVertexArray(_vao);
size_t numberOfVertices = 3;
glDrawArrays(GL_TRIANGLES, 0, numberOfVertices);
// Unbind the Vertex Array object
glBindVertexArray(0);
// Cleanup, not strictly necessary
glUseProgram(0);
}
void Model::resize(int width, int height)
{
_width = width;
_height = height;
_offsetX = 0;
_offsetY = 0;
}
i'm using ubuntu 13.10.
It looks that some thing has changed by some Ubuntu 13.10 sw updates. I had also code that has compiled and run without problem and just one day I started to get same Assertion `needed != ((void *)0)' failed! error but only if I compiled my code again with current gcc/lib versios.
After debugging I found out that the assert error comes from /lib/i386-linux-gnu/ld-2.17.so
struct link_map *needed = find_needed (strtab + ent->vn_file, map);
/* If NEEDED is NULL this means a dependency was not found
and no stub entry was created. This should never happen. */
assert (needed != NULL);
It is said that this should never happen and it does not say what is needed but not found. Some gdb work and i found that it needs libpthread.so.0 . The good question is that why /usr/bin/ld linker linking application and ld.so disagree about need of this library.
I did not intentionally use libpthread but from somewhere i got to my link map reference to __pthread_key_create@@GLIBC_2.0 I don't know where this comes but it may cause need of libpthread.so without adding NEEDED libpthread.so.0 as follows on objdump -p :
Dynamic Section:
NEEDED libglut.so.3
NEEDED libGLU.so.1
NEEDED libGL.so.1
NEEDED libstdc++.so.6
NEEDED libgcc_s.so.1
NEEDED libpthread.so.0
NEEDED libc.so.6
I did not find a root cause of this problem but least workaround. You need link your code with -pthread option and have some dummy call to this library .
Define in you Makefile libs
-lglut -lGLU -lGL -lm -pthread
Then include some dummy function just refer some libpthread function to make linker link it and you get the NEEDED libpthread.so.0 and then ld.so is hap.
#include <pthread.h>
void junk() {
int i;
i=pthread_getconcurrency();
};
This helped for me, i hope that it helps.
There is more analysis in Ubuntu launcpad https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-319/+bug/1248642?comments=all
If you have an nvidia graphics card like mine, this might work for you
g++ -L/usr/lib/nvidia-304/ your-file.cc -lglut -lGLEW -lGL
Replace the 304 with the nvidia driver version. More details about this bug can be found at this link.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With