Compiler machine compatibility

I have some code that lives on top of Gnu Radio, and I think I’m having
a code-generation issue with GCC. The binaries work on all
my machines, but on a customers machine, it raises an Illegal
Instruction exception. I generated the code on a 32-bit Intel Core
machine, on Fedora 12. The code is executing on a Pentium-IV class
machine, on a Fedora 12 installation. I gather than by default
GCC will generate code that’s optimized for the machine on which the
compile is happening. How do distributors of binaries assure
that the code will execute correctly on older-generation hardware?

On Fri, 2011-04-08 at 12:29 -0400, Marcus D. Leech wrote:

I have some code that lives on top of Gnu Radio, and I think I’m having
a code-generation issue with GCC. The binaries work on all
my machines, but on a customers machine, it raises an Illegal
Instruction exception. I generated the code on a 32-bit Intel Core
machine, on Fedora 12. The code is executing on a Pentium-IV class
machine, on a Fedora 12 installation. I gather than by default
GCC will generate code that’s optimized for the machine on which the
compile is happening. How do distributors of binaries assure
that the code will execute correctly on older-generation hardware?

Make sure you’re compiling with optimization flags appropriate for the
hardware you’re planning to run on. For instance, if you spec -msse3 or
newer on a pre-Prescott P4, you’ll generate instructions the CPU can’t
execute. I’m pretty sure GCC won’t generate these instructions unless
you specify it using these flags so make sure your automake/cmake setup
isn’t doing so.

Another issue is if you compile on a 32-bit compiler it’ll barf on a
64-bit system, and this might generate an illegal instruction error.
This is the reason package maintainers keep a 32-bit and 64-bit version
of their packages. If you want to make code that runs on a 64-bit system
from your 32-bit system, you’ll have to use a 64-bit GCC installation (I
think GCC is the same for either, but you need 64-bit libc) and use -m64
as a compile flag.

–n

On 08/04/2011 1:06 PM, Nick F. wrote:

This is the reason package maintainers keep a 32-bit and 64-bit version
of their packages. If you want to make code that runs on a 64-bit system
from your 32-bit system, you’ll have to use a 64-bit GCC installation (I
think GCC is the same for either, but you need 64-bit libc) and use -m64
as a compile flag.

Hmm, my “make” use using the “naked” compiler without any extra flags.
The target system is
a Pentium-IV, and my build system is a 32-bit Intel Core (T2400).

On 04/08/2011 01:06 PM, Nick F. wrote:

This is the reason package maintainers keep a 32-bit and 64-bit version
of their packages. If you want to make code that runs on a 64-bit system
from your 32-bit system, you’ll have to use a 64-bit GCC installation (I
think GCC is the same for either, but you need 64-bit libc) and use -m64
as a compile flag.

–n
OK, so it turns out that I lied, viciously and nastily. Brazenly, even
:slight_smile:

I had -msse3 turned on, which won’t work on an early Pentium 4, but will
work on late-model Pentium 4.

So, I cranked-back the optimization flags to -msse2, which was available
for Pentium 4.


Marcus L.
Principal Investigator
Shirleys Bay Radio Astronomy Consortium