<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body dir="ltr" bgcolor="#ffffff" text="#000000">
Hi all,<br>
<br>
I'm having a weird problem at a client's. They need a toolchain for
both Windows (cygwin) and Linux. What's more, then need the two
toolchains to match exactly - given identical source code, the
toolchains must produce the exact same machine code (tested by doing
objdump -d and diffing the outputs). The toolchains are for bare metal
power-pc (powerpc-eabi target).<br>
<br>
At first I just compiled gcc and newlib on both systems, but the
results from compilation varied greatly. I traced it down to cygwin and
Debian Lenny providing different versions of the supporting libraries
(mpfr etc), which caused to optimizer to perform different different
optimizations, producing correct, but different, results when compiling
the same code on Windows or on Linux.<br>
<br>
For my second run, I compiled all supporting libraries as well. I made
sure to run "make check" on every step. I got two toolchains, and
compiled newlib and the actual project with both. This time, the
results were noticeably better. The newlib libraries, as well as some
of the libraries for the project, did compile the same with the Linux
and the Cygwin toolchains. Some libraries, however, did not. Again,
this does not appear to be a case of the compiler producing wrong code,
just different.<br>
<br>
In case you are wondering, I made sure that the code the compiler sees
is identical between the build environments, by stopping after the
pre-processor stage and comparing the files. Except for the source file
paths, the files post-pre-processing and pre-compilation are identical.<br>
<br>
One thing that was different between the setups was the native compiler
version used to compile the cross compiler itself. With Cygwin, I used
gcc 4.3.4 to compile the libraries and gcc, on Linux I used gcc 4.4.3.
In both cases, the cross compiler itself is gcc 4.4.3 with fairly
latest versions of everything. While I am definitely going to next try
compiling on Linux with 4.3.4, I fail to see how the version of the
compiler has such an effect on the output of the program.<br>
<br>
Since this question is some what recursive, I'll try to recap in the
form of a table:<br>
<table border="1" cellpadding="2" cellspacing="2" width="100%">
  <tbody>
    <tr>
      <td valign="top">Cygwin 1.7<br>
      </td>
      <td valign="top">Linux Debian Lenny/Sid<br>
      </td>
    </tr>
    <tr>
      <td valign="top">Use native gcc-4.3.4 to build toolchain<br>
      </td>
      <td valign="top">Use native gcc-4.4.3 (from Sid) to build
toolchain<br>
      </td>
    </tr>
    <tr>
      <td valign="top">Build native mpc-0.8.1, mpfr-2.4.2, gmp-4.3.2,
cloog-ppl-0.15.7, ppl-0.10.2 using gcc-4.3.4 as static objects<br>
      </td>
      <td valign="top">Build the same libraries as on the left using
gcc-4.4.3, with same configure options, except as shared objects<br>
      </td>
    </tr>
    <tr>
      <td valign="top">Build cross binutils-2.20.51 and gcc-4.4.3 using
gcc-4.3.4<br>
      </td>
      <td valign="top">Build the same versions of binutils and gcc
using gcc-4.4.3. Same command line options<br>
      </td>
    </tr>
    <tr>
      <td valign="top">Build newlib-1.18.0 using the cross-gcc 4.4.3
compiled in the previous step<br>
      </td>
      <td valign="top">Build the same version using the gcc compiled in
the previous step. Same configure options<br>
      </td>
    </tr>
    <tr>
      <td valign="top">Build the client's project using the above
toolchain<br>
      </td>
      <td valign="top">Build the client's project using the above
toolchain<br>
      </td>
    </tr>
  </tbody>
</table>
<br>
The newlib libraries built are compared, and are identical down to the
last assembly instruction. The client libraries are compared. Some are
identical, some are not.<br>
<br>
Any thoughts and/or suggestions are welcome.<br>
<br>
Shachar<br>
<pre class="moz-signature" cols="72">-- 
Shachar Shemesh
Lingnu Open Source Consulting Ltd.
<a class="moz-txt-link-freetext" href="http://www.lingnu.com">http://www.lingnu.com</a>
</pre>
</body>
</html>