Documentation on how to build 32bit applications on amd64?

Dan Nelson dnelson at
Fri Aug 13 21:44:59 UTC 2010

In the last episode (Aug 13), Yuri said:
> On 08/13/2010 09:24, Dan Nelson wrote:
> > Try adding -B/usr/lib32 to your first gcc line.  The specs file should
> > be modified to add this automatically when you pass -m32, imho.
> Thank you Dan, this flag worked.
> But I found a strange discrepancy between 32bit and 64bit.
> When I compile the program below in 64 bit, I get the correct result. 
> With 32 bit executable compiled on 64 bit system like you suggested 
> there is another (wrong) result. On 32 bit system result is also 
> correct, the same as with 64 executable.
> This is a very strange discrepancy. rm_eo field is zero in the match 
> result which is wrong. I can't think of any explanation for it.

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.

	Dan Nelson
	dnelson at

More information about the freebsd-questions mailing list