[PATCH] Fix CFLAGS overwrite by Makefile

John Baldwin jhb at freebsd.org
Wed May 25 19:44:04 UTC 2011


On Wednesday, May 25, 2011 1:03:10 pm Arnaud Lacombe wrote:
> Hi,
> 
> On Wed, May 25, 2011 at 12:28 PM, John Baldwin <jhb at freebsd.org> wrote:
> > On Wednesday, May 25, 2011 11:34:29 am Arnaud Lacombe wrote:
> >> Hi,
> >>
> >> On Wed, May 25, 2011 at 9:43 AM, John Baldwin <jhb at freebsd.org> wrote:
> >> >> The original trouble I met, is that building for an i586 target in a
> >> >> 32bits jail, on top of an amd64 system[0] (I do not have control over
> >> >> that setup) produces incorrect binaries. The current fix I've got is
> >> >> to define MACHINE_ARCH=i386 and CPUTYPE=i586. This enforces
> >> >> `-march=i586' to be passed to the compiler, for all except the
> >> >> bootloader (because it overwrites CFLAGS). With this, binaries
> >> >> produced works fine (ie. /bin/sh no longer SIGILL when bringing up the
> >> >> system). So I suspect that gcc default to i686 in this setup and
> >> >> corrupt all the binaries, thus the attached patch.
> >> >
> >> > Wait.  You must have something wrong in your jail if you can't do a
> > buildworld
> >> > with CPUTYPE set to none and have it do the right thing.  You need to 
find
> >> > your root problem.  Forcing CPUCFLAGS for the boot code is a band-aid,
> > it's
> >> > not the right solution to your problem.
> >> >
> >> Unless error of my part, I never mentioned it was using `buildworld',
> >> which it is not. The system uses bare calls to make(1) in the
> >> sys/boot/ directory. As the jail is 32bits, it was expected not to be
> >> an issue, but the jail compiler uses /lib/libstand.a to link the
> >> loader, and it obviously contains i686-only instructions, which
> >> trigger a reset of an i586-only CPU.
> >>
> >> The more broad issue with the setup is that gcc within that
> >> environment, without being told -march=i586, produces i686
> >> instructions which are incompatible with the target CPU.
> >
> > Huh?  GCC does not generate i686 instructions by default on FreeBSD/i386. 
 It
> > generates i486 instructions but that is all.
> something is odd somewhere.
> 
> > Are you sure you aren't running
> > the 64-bit gcc (which will generate i686 instructions by default)?
> >
> yes.
> 
> # which gcc
> /usr/bin/gcc
> 
> # file /usr/bin/gcc
> /usr/bin/gcc: ELF 32-bit LSB executable, Intel 80386, version 1
> (FreeBSD), for FreeBSD 7.1, statically linked, FreeBSD-style, stripped
> 
> # gcc -v
> Using built-in specs.
> Target: i386-undermydesk-freebsd
> Configured with: FreeBSD/i386 system compiler
> Thread model: posix
> gcc version 4.2.1 20070719  [FreeBSD]
> 
> # uname -a
> FreeBSD build 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Fri May  1 07:18:07
> UTC 2009     root at driscoll.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC
>  amd64
   ^^^^^

I think this is probably going to confuse make and some other things as well.

-- 
John Baldwin


More information about the freebsd-current mailing list