Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error running a compiled C++ file (uses OpenGL). Error: “Inconsistency detected by ld.so: dl-version.c: 224”

Tags:

ubuntu

opengl

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.

like image 964
user216112 Avatar asked Nov 15 '13 18:11

user216112


2 Answers

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

like image 145
user3012797 Avatar answered Sep 21 '22 07:09

user3012797


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.

like image 28
Ash Catchem Avatar answered Sep 20 '22 07:09

Ash Catchem