How to use older libs in 32bit mode?

Peter Wemm peter at wemm.org
Fri Nov 26 12:38:21 PST 2004


On Friday 26 November 2004 11:17 am, Peter Wemm wrote:
> On Friday 26 November 2004 10:46 am, Michael R. Wayne wrote:
> > On Thu, Nov 25, 2004 at 12:42:33PM -0800, Peter Wemm wrote:
> > > Things to check:
> > >
> > > * Make sure you have COMPAT_IA32 in your kernel config.  For
> > > example, this command should work:
> > >
> > > peter at overcee[8:16pm]~/fbp4/hammer/sys/amd64/conf-120> sysctl
> > > kern.elf32 kern.elf32.fallback_brand: -1
> > > (The important thing is that it prints something, not the value)
> >
> > Yes:
> >    > sysctl kern.elf32
> >
> >    kern.elf32.fallback_brand: -1
> >
> > > * Make sure you have NOT copied ld-elf or libc from an i386
> > > system. You *MUST* build at least these two on your machine.  How
> > > to check:
> > >
> > > peter at overcee[8:17pm]~-123> strings /libexec/ld-elf32.so.1 | grep
> > > libmap32 /etc/libmap32.conf
> > > If this comes up empty, you're in trouble.  Check that
> > > /usr/libexec/ld-elf32.so.1 and /libexec/ld-elf.so.1 are the same
> > > file.
> >
> > So far OK:
> >    > strings /libexec/ld-elf32.so.1 | grep libmap32
> >
> >    /etc/libmap32.conf
> > and
> >    lrwxr-xr-x  1 root  wheel      22 Nov 15 17:13
> > /usr/libexec/ld-elf32.so.1@ -> /libexec/ld-elf32.so.1
> >
> > > These will not be present on a 5.3-release system.
> >
> > Running 5.3-RELEASE so they are not present, as expected.
> >
> > > Oh wait a second.  Did you build your libraries with
> > > WITH_LIB32=yes or by running build32.sh ?  I have a suspicion
> > > that build32.sh will produce a bad library now.
> >
> > Aha.  Yes, I built with build32.sh as it was the only way I found
> > to do it.  If this is not correct, perhaps someone could put up a
> > quick "how-to" page and post a URL?
> >
> > It would also be useful to understand how to build a port for i386,
> > google was not helpful in determining how to do this.
> >
> > > BTW: it is helpful to do a ktrace/kdump and show the last few
> > > lines. I suspect there will be a sysarch syscall, followed by a
> > > SIGSEGV.
> >
> > You are correct:
> >    72509 hello    CALL  sysarch(0x1,0xffffd70c)
> >    72509 hello    RET   sysarch -1 errno 22 Invalid argument
> >    72509 hello    PSIG  SIGSEGV SIG_DFL
> >    72509 hello    NAMI  "hello.core"
> >
> > So, it looks like build32.sh is broken on 5.3-RELEASE.  What now?
>
> Oh no!  It means that FreeBSD/i386 binaries unconditionally use TLS
> (thread-local-storage) setup calls in early startup.  That means we
> are hosed until a bunch of TLS support routines are merged from 6.0
> to 5.3-stable.
>
> Unfortunately, there is nothing that you can do for now.  :-(

I've merged some of the changes (rtld-elf/reloc.c and 
libc/i386/gen/_set_tp.c), and removed build32.sh from RELENG_5.  If you 
were to build a new set of libraries, I expect it will work now.  
libc_r threaded binaries might work, but libthr  and libpthread 
binaries will not.  If you need to run something threaded, you can set 
libmap32.conf to remap all libthr or libpthread references into libc_r.

BTW: if you have already done a buildworld, it might be possible to 
rebuild just the 32 bit libraries without a full buildworld again.  If 
you want to try this, then "cd /usr/src; rm -rf /usr/obj/lib32; make 
build32; make install32"

-- 
Peter Wemm - peter at wemm.org; peter at FreeBSD.org; peter at yahoo-inc.com
"All of this is for nothing if we don't go to the stars" - JMS/B5


More information about the freebsd-amd64 mailing list