Now transfer test1.cpp, test2.o and test3.o to a Linux
or FreeBSD machine and compile/link them together and
run:
g++ test1.cpp test2.o test3.o
./a.out

The output of the test program is 4. The correct value
should be 8. The self-relative reference from test2 to
test3 points to an address that is 4 bytes too high. If
the two procedures test2 and test3 are in the same
module, then the result is correct (output = 8).

My guess is that the error is due to the two object file
formats differing in whether self-relative fixups are
calculated relative to the beginning or the end of the 32-
bit reference word.

This may be a generic error in the Gnu package, but I
can't check this because I don't know how to make Gnu
under Linux support the pe-i386 format.

The reason why I want to convert object files from pe-
i386 to elf32-i386 format is that the de-facto standard
MASM syntax for x86 assembly is not supported by any
assembler that can generate ELF output, and I want to
use the same assembly source under different operating
systems.