[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