Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Aug 2010 15:57:43 -0700
From:      Yuri <yuri@rawbw.com>
To:        Dan Nelson <dnelson@allantgroup.com>
Cc:        freebsd-questions@freebsd.org
Subject:   Re: Documentation on how to build 32bit applications on amd64?
Message-ID:  <4C65CDE7.5010001@rawbw.com>
In-Reply-To: <20100813214457.GF18896@dan.emsphone.com>
References:  <4C656E8F.8090105@rawbw.com> <20100813162429.GE18896@dan.emsphone.com> <4C65852B.807@rawbw.com> <20100813214457.GF18896@dan.emsphone.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 08/13/2010 14:44, Dan Nelson wrote:
> I think Anonymous is right, and that it's due to the /usr/include headers on
> amd64 not being 32-bit-mode aware.  So you end up with some structure
> members being sized for 64-bit machines instead of 32-bit.  I bet struct
> regex_t on your cross-compiled program is the same size as your native
> 64-bit program, where it should match your 32-bit program instead.  I took
> that "-B /usr/lib32" flag from /usr/src/Makefile.inc1 , where it builds the
> lib32 compat libraries, and it looks like it also temporarily installs a
> full 32-bit include directory and compiles against that with "-iprefix
> ${LIB32TMP}/usr/" .  You may have to install a full 32-bit tree somewhere
> and chroot to it to build, or look more closely at how buildworld compiles
> the lib32 stuff and mimic that, or submit patches to the base include files
> that make them 32 and 64-bit compatible depending on compiler flags.
>    

I think the best way is to modify headers to depend on compiler flags 
(__i386/__amd64). This makes such cross compile seamless for all future 
attempts to cross compile.
The problem I see is that there are currently 83 includes of 
<machine/...> headers from outside the machine/ hierarchy.
cd /usr/include && grep -r "<machine" * | grep include | grep -v ^machine
Looks like all of them should be made conditional on compiler flags like 
this:
...
#if !defined(__i386)
#include <machine/header.h>
#else
#include </usr/src/sys/i386/include/header.h>
#endif
...
Or rather pointing to some location (if any) where 32 bit headers would 
normally reside on amd64 host.
Do you think this is reasonable?
Should I make a patch, or maybe further discuss on hackers@?

Yuri



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4C65CDE7.5010001>