I noticed that one of my packages, nazghul, which depends on SDL_image fails to link on i386 because of missing symbols from libpng, while on x86_64 it links fine. I found that SDL_image-1.2.5-3.fc7.i386.rpm is missing many dependencies that are there in SDL_image-1.2.5-3.fc7.x86_64.rpm: > rpm -qp --requires /nas/redhat/mirror-extras/development/i386/SDL_image-1.2.5-3.fc7.i386.rpm /sbin/ldconfig /sbin/ldconfig libSDL-1.2.so.0 libSDL_image-1.2.so.0 libc.so.6 libc.so.6(GLIBC_2.0) libc.so.6(GLIBC_2.1.3) libc.so.6(GLIBC_2.3) libc.so.6(GLIBC_2.3.4) libc.so.6(GLIBC_2.4) libpthread.so.0 libpthread.so.0(GLIBC_2.0) rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rtld(GNU_HASH) > rpm -qp --requires /nas/redhat/mirror-extras/development/x86_64/SDL_image-1.2.5-3.fc7.x86_64.rpm /sbin/ldconfig /sbin/ldconfig libSDL-1.2.so.0()(64bit) libSDL_image-1.2.so.0()(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libjpeg.so.62()(64bit) libpng12.so.0()(64bit) libpng12.so.0(PNG12_0)(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libtiff.so.3()(64bit) libz.so.1()(64bit) rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rtld(GNU_HASH) I'm at somewhat of a loss as to what could have happened; the package seems simple enough.
There's some weird breakage also with FC-6 i386. Check this out! The image library deps are missing, the audio library deps from SDL are duplicated: $ ldd /usr/lib/libSDL_image-1.2.so.0.1.4 linux-gate.so.1 => (0x00d93000) libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0x02631000) libpthread.so.0 => /lib/libpthread.so.0 (0x00909000) libc.so.6 => /lib/libc.so.6 (0x0079b000) libdl.so.2 => /lib/libdl.so.2 (0x00903000) libesd.so.0 => /usr/lib/libesd.so.0 (0x07817000) libaudiofile.so.0 => /usr/lib/libaudiofile.so.0 (0x0787d000) libm.so.6 => /lib/libm.so.6 (0x008da000) /lib/ld-linux.so.2 (0x0077e000) libasound.so.2 => /lib/libasound.so.2 (0x076dd000)
It loads the libraries at run-time via SDL and their SONAMEs. Hence no dependencies detected by rpmbuild: -- dynamic libtiff -> libtiff.so.3 -- dynamic libjpeg -> libjpeg.so.62 -- dynamic libpng -> libpng.so.3 -DLOAD_TIF_DYNAMIC=\"libtiff.so.3\" -DLOAD_JPG_DYNAMIC=\"libjpeg.so.62\" -DLOAD_PNG_DYNAMIC=\"libpng.so.3\"
./configure --help --enable-jpg-shared dynamically load JPG support [default=yes] --enable-png-shared dynamically load PNG support [default=yes] --enable-tif-shared dynamically load TIFF support [default=yes]
(In reply to comment #2) > It loads the libraries at run-time via SDL and their SONAMEs. Hence > no dependencies detected by rpmbuild: > > -- dynamic libpng -> libpng.so.3 > Interesting that this is detecting (and I assume using) libpng.so.3. On x86_64: $ ldd libSDL_image-1.2.so.0.1.4 |grep png libpng12.so.0 => /usr/lib64/libpng12.so.0 (0x00002aaaaacdf000) This is starting to look like SDL_image on x86_64 is the one that's broken. from nazghul's build logs: /builddir/build/BUILD/nazghul-0.5.5/src/screen.c:872: undefined reference to `png_create_write_struct' It look like nazghul directly uses libpng. It has been relying on SDL_image pulling in libpng but should be doing its own configure check instead.
Yes, it seems that nazghul is indeed broken; it should link against libpng itself. What confused me is that the normally problematic x86_64 build is the only one that worked.
An official log is still available: http://buildsys.fedoraproject.org/logs/fedora-6-extras/22438-SDL_image-1.2.5-3.fc6/x86_64/build.log Somebody who's familiar with libpng is needed, since: * /usr/bin/libpng-config links to /usr/bin/libpng12-config * libpng-config --libs -lpng12 * /usr/lib/pkgconfig/libpng.pc links to libpng12.pc * /usr/lib/libpng.so links to libpng12.so So, in all these cases libpng12.so.0 is used, _not_ libpng.so.3 On i386, however, libpng.so.3 is detected and used and loaded at run-time only. On x86_64, the dynamic loading is not enabled (examining config.log might give a clue).
And the reason for the difference between i386 and x86_64 is that /usr/lib is hardcoded in the configure script in code that searches for the png/jpeg/tiff libs. It also searches for $path/libpng.so.[0-9] which fails to find "libpng12.so.0". The configure options --disable-jpg-shared --disable-png-shared -disable-tif-shared disable the run-time loading of the libs and bring back the rpmbuild soname dependencies.
Michael, thanks for investigating this will I was gone this weekend. Hopefully, later today I can get some time to work on this.