In trying to compile the latest Mozilla snapshot I ran in to an
interesting linker problem in that I got error messages along the lines
of:

/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__bsd_signal'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `_xstat'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__sigjmp_save'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__setjmp'

The thing is, it was not supposed to link to any libc5 libraries.  I
managed to isolate the problem which can be reproduced by simply running

$ gcc -o foo -L/usr/X11R6/lib -lXmu
/usr/lib/crt1.o(.text+0x18): undefined reference to `main'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__bsd_signal'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `_xstat'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__sigjmp_save'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__setjmp'
/usr/X11R6/lib/libXext.so.6: undefined reference to `_Xglobal_lock'
/usr/X11R6/lib/libXext.so.6: undefined reference to `_XUnlockMutex_fn'
/usr/X11R6/lib/libXext.so.6: undefined reference to `_XLockMutex_fn'
collect2: ld returned 1 exit status

I have the xlib6g, xlib6g-dev, and xlib6 packages installed (but not the
xlib6-altdev package).  Furthermore,

$ ls -l /usr/X11R6/lib/libXmu.so*
lrwxrwxrwx   1 root     root           13 May 16 04:30
/usr/X11R6/lib/libXmu.so -> libXmu.so.6.0
lrwxrwxrwx   1 root     root           13 May 16 04:30
/usr/X11R6/lib/libXmu.so.6 -> libXmu.so.6.0
-rw-r--r--   1 root     root        74428 May 10 03:53
/usr/X11R6/lib/libXmu.so.6.0

$ ldd /usr/X11R6/lib/libXmu.so
ldd: warning: you do not have execution permission for
`/usr/X11R6/lib/libXmu.so'
        libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x40019000)
        libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x40063000)
        libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x4006d000)
        libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40084000)
        libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40090000)
        libc.so.6 => /lib/libc.so.6 (0x40136000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x2aaaa000)

So nothing is out of the ordinary.  Running the gcc command line with the
"-Wl,-verbose" option (to enable verbose linking) doesn't reveal the
problem. Relevant parts of the output are reproduced here:

$ gcc -o foo -L/usr/X11R6/lib -lXmu -Wl,-verbose
GNU ld version 2.9.1 (with BFD 2.9.1.0.24)
  Supported emulations:
   elf_i386
   i386linux
using internal linker script:
==================================================
OUTPUT_FORMAT("elf32-i386", "elf32-i386",
              "elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(_start)
SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib);
SEARCH_DIR(/usr/i486-linux/lib);
/* Do we need any of these for elf?
   __DYNAMIC = 0;    */
SECTIONS
{
  /* Read-only sections, merged into text segment: */
  . = 0x08048000 + SIZEOF_HEADERS;

[...]

  /* SGI/MIPS DWARF 2 extensions */
  .debug_weaknames 0 : { *(/usr/lib/crt1.o(.text+0x18): undefined
reference to `main'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__bsd_signal'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `_xstat'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__sigjmp_save'
/usr/lib/libc5-compat/libICE.so.6: undefined reference to `__setjmp'
/usr/X11R6/lib/libXext.so.6: undefined reference to `_Xglobal_lock'
/usr/X11R6/lib/libXext.so.6: undefined reference to `_XUnlockMutex_fn'
/usr/X11R6/lib/libXext.so.6: undefined reference to `_XLockMutex_fn'
.debug_weaknames) }
  .debug_funcnames 0 : { *(.debug_funcnames) }
  .debug_typenames 0 : { *(.debug_typenames) }
  .debug_varnames  0 : { *(.debug_varnames) }
  /* These must appear regardless of  .  */
}


==================================================
attempt to open /usr/lib/crt1.o succeeded
/usr/lib/crt1.o
attempt to open /usr/lib/crti.o succeeded
/usr/lib/crti.o

[...]

Incidentally, moving the /usr/lib/libc5-compat directory out of the way
seems to cure the problem.  Now I get

$ gcc -o foo -L/usr/X11R6/lib -lXmu
/usr/lib/crt1.o(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status

as I'm supposed to.

For the record, I'm running up to date (as of yesterday) potato on a 2.2.9
kernel.

I'm really at a loss here, I can usually solve my own problems but this
looks like a genuine linker/compiler bug to me.  I would file this as a
bug report if I knew exactly where the problem was and that it isn't just
my system that's somehow screwed up.

Please try if you can reproduce this problem.
-- 
       /'"`\  zzzZ  | My PGP Public Key is available at:
      ( - - )       | <http://home1.inet.tele.dk/renehl/>
--oooO--(_)--Oooo------------------------------------------ 
 Don't ya just hate it when there's not enough room to fin 

Reply via email to