[uClibc] dlopen/dlsym breaks libpng

David Wuertele dave-gnus at bfnet.com
Tue Aug 5 19:38:11 UTC 2003


Are there any workarounds for this problem?  Is a fix for the known
dlopen() bug on the horizon?

Platform:  mipsel / buildroot (circa July 1) / uClibc (circa Aug 4) / libpng-1.2.5

Problem:
  1.  program "test-usepng-lusepng" doesn't use dlopen/dlsym, libpng
      works fine
  2.  program "test-usepng-dlopen" uses dlopen/dlsym, libpng segfaults

Hypothesis:  this looks like its related to the known bug that
    "Applications that use dlopen() to load libraries that themselves
    depend on other libraries, may have weak symbols within those
    depended-upon libraries resolved incorrectly."

Test programs:

  /** usepng.cpp **/
  #include <png.h>
  extern "C" void usepng ()
  {
    fprintf (stderr, "%s:%d %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__);
    png_structp png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
    fprintf (stderr, "%s:%d %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__);
  }

--

  /** test-usepng-lusepng.cpp **/
  #include <stdio.h>
  #define DBG fprintf (stderr, "%s:%d %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__)
  extern "C" void usepng();
  int main()
  { DBG;
    usepng(); DBG;
    return 0;
  }

--

  /** test-usepng-dlopen.cpp **/
  #include <stdio.h>
  #include <dlfcn.h>
  #define DBG fprintf (stderr, "%s:%d %s\n", __FILE__, __LINE__, __PRETTY_FUNCTION__)
  int main()
  { DBG;
    void *libusepng = dlopen("/usr/local/lib/libusepng.so", RTLD_NOW); DBG;
    if (libusepng) { DBG;
    char *error; void (*usepng)(); DBG;
      usepng = (void (*)()) dlsym (libusepng, "usepng"); DBG;
      if ((error = dlerror()) != NULL)  { DBG;
        fprintf (stderr, "dlsym: %s\n", error);
      } else { DBG;
        (*usepng)(); DBG;
      } DBG;
      dlclose(libusepng);
    } DBG;
    return 0;
  }

--
  # Makefile
  # USES -lDL
  test-usepng-dlopen: test-usepng-dlopen.cpp
          $(CXX) $(CXXFLAGS) -o $@ $< -ldl

  # LINKS DYNAMICALLY
  test-usepng-lusepng: test-usepng-lusepng.cpp
          $(CXX) $(CXXFLAGS) -o $@ $< -L$(CASCADE_LIBRARIES) -lusepng

  libusepng.so: usepng.cpp
          $(CXX) -shared -ldl -rdynamic -o $@ $^ -L$(PNG_LIBRARIES) -lpng -L$(ZLIB_LIBRARIES) -lz


Symptom:  Running test-usepng-lusepng works as expected.  Running
          test-usepng-dlopen results in a SEGFAULT inside libpng:

  / # /usr/local/bin/test-usepng-lusepng
  test-usepng-lusepng.cpp:6 int main()
  usepng.cpp:5 void usepng()
  usepng.cpp:7 void usepng()
  test-usepng-lusepng.cpp:7 int main()
  / # /usr/local/bin/test-usepng-dlopen
  test-usepng-dlopen.cpp:6 int main()
  test-usepng-dlopen.cpp:7 int main()
  test-usepng-dlopen.cpp:8 int main()
  test-usepng-dlopen.cpp:9 int main()
  test-usepng-dlopen.cpp:10 int main()
  test-usepng-dlopen.cpp:13 int main()
  usepng.cpp:5 void usepng()
  SIGSEGV
  / # 




More information about the uClibc mailing list