I did a topic a [little earlier](https://forum.dlang.org/thread/hfzsnagofrnlmynyz...@forum.dlang.org) about compiling a compiler for processor Geode LX800. The bottom line is that I have a processor on which I want to compile the program, is an i586 architecture.

The [official documentation](https://www.amd.com/system/files/TechDocs/33234H_LX_databook.pdf) says that "*... the core is a combination of Intel Pentium ® processor, AMD Athlon™ processor, and AMD Geode LX processor specific instructions.*" - this means that the processor architecture is **<** `i686`. And judging by the fact that Linux gives a description when calling `uname`:

```sh
# uname -m
i586
```

This suggests that the processor is CLEARLY `i586`.
The problem is that I can't assemble the software I need for this processor, since it is automatically assembled for `i686`.
What have I done?
I built an `ldc` compiler on this machine:

```sh
# ldc2 --version
LDC - the LLVM D compiler (1.30.0-git-32f5a35):
  based on DMD v2.100.1 and LLVM 10.0.1
  built with DMD32 D Compiler v2.086.1
  Default target: i686-pc-linux-gnu
  Host CPU: geode
  http://dlang.org - http://wiki.dlang.org/LDC

  Registered Targets:
    x86    - 32-bit X86: Pentium-Pro and above
    x86-64 - 64-bit X86: EM64T and AMD64
```

And when I try to compile the program through it, I create a binary file, but when I start it outputs **Illegal instruction**:

```sh
# ldc2 app.d
# ./app
Illegal instruction
```

Here's using the `mcpu` flag:

```sh
# ldc2 --mcpu=i586 app.d -v
binary    /mnt/disc/sdb/part1/program/ldc/1.30/install/bin/ldc2
version   1.30.0-git-32f5a35 (DMD v2.100.1, LLVM 10.0.1)
config /mnt/disc/sdb/part1/program/ldc/1.30/install/etc/ldc2.conf (i686-pc-linux-gnu) predefs LDC all D_Version2 assert D_PreConditions D_PostConditions D_Invariants D_ModuleInfo D_Exceptions D_TypeInfo X86 D_InlineAsm_X86 D_HardFloat LittleEndian D_PIC linux Posix CRuntime_Glibc CppRuntime_Gcc LDC_LLVM_1000
parse     app
importall app
import object (/root/usr/program/ldc/1.30/install/include/d/object.d) import core.attribute (/root/usr/program/ldc/1.30/install/include/d/core/attribute.d) import ldc.attributes (/root/usr/program/ldc/1.30/install/include/d/ldc/attributes.d) import core.internal.hash (/root/usr/program/ldc/1.30/install/include/d/core/internal/hash.d) import core.internal.traits (/root/usr/program/ldc/1.30/install/include/d/core/internal/traits.d) import core.internal.entrypoint (/root/usr/program/ldc/1.30/install/include/d/core/internal/entrypoint.d) import core.internal.array.appending (/root/usr/program/ldc/1.30/install/include/d/core/internal/array/appending.d) import core.internal.array.comparison (/root/usr/program/ldc/1.30/install/include/d/core/internal/array/comparison.d) import core.internal.array.equality (/root/usr/program/ldc/1.30/install/include/d/core/internal/array/equality.d) import core.internal.array.casting (/root/usr/program/ldc/1.30/install/include/d/core/internal/array/casting.d) import core.internal.array.concatenation (/root/usr/program/ldc/1.30/install/include/d/core/internal/array/concatenation.d) import core.internal.array.construction (/root/usr/program/ldc/1.30/install/include/d/core/internal/array/construction.d) import core.internal.array.capacity (/root/usr/program/ldc/1.30/install/include/d/core/internal/array/capacity.d) import core.internal.dassert (/root/usr/program/ldc/1.30/install/include/d/core/internal/dassert.d) import core.atomic (/root/usr/program/ldc/1.30/install/include/d/core/atomic.d) import core.internal.attributes (/root/usr/program/ldc/1.30/install/include/d/core/internal/attributes.d) import core.internal.atomic (/root/usr/program/ldc/1.30/install/include/d/core/internal/atomic.d) import ldc.intrinsics (/root/usr/program/ldc/1.30/install/include/d/ldc/intrinsics.di) import core.internal.destruction (/root/usr/program/ldc/1.30/install/include/d/core/internal/destruction.d) import core.internal.moving (/root/usr/program/ldc/1.30/install/include/d/core/internal/moving.d) import core.internal.postblit (/root/usr/program/ldc/1.30/install/include/d/core/internal/postblit.d) import core.internal.switch_ (/root/usr/program/ldc/1.30/install/include/d/core/internal/switch_.d) import core.lifetime (/root/usr/program/ldc/1.30/install/include/d/core/lifetime.d) import core.builtins (/root/usr/program/ldc/1.30/install/include/d/core/builtins.d)
semantic  app
entry     main          app.d
semantic2 app
semantic3 app
import std.stdio (/root/usr/program/ldc/1.30/install/include/d/std/stdio.d) import core.stdc.stddef (/root/usr/program/ldc/1.30/install/include/d/core/stdc/stddef.d) import std.algorithm.mutation (/root/usr/program/ldc/1.30/install/include/d/std/algorithm/mutation.d) import std.traits (/root/usr/program/ldc/1.30/install/include/d/std/traits.d) import std.meta (/root/usr/program/ldc/1.30/install/include/d/std/meta.d) import std.range.primitives (/root/usr/program/ldc/1.30/install/include/d/std/range/primitives.d) import std.typecons (/root/usr/program/ldc/1.30/install/include/d/std/typecons.d) import std.format.spec (/root/usr/program/ldc/1.30/install/include/d/std/format/spec.d) import std.format.write (/root/usr/program/ldc/1.30/install/include/d/std/format/write.d) import std.format.internal.write (/root/usr/program/ldc/1.30/install/include/d/std/format/internal/write.d) import std.internal.attributes (/root/usr/program/ldc/1.30/install/include/d/std/internal/attributes.d) import std.range (/root/usr/program/ldc/1.30/install/include/d/std/range/package.d) import std.array (/root/usr/program/ldc/1.30/install/include/d/std/array.d) import std.functional (/root/usr/program/ldc/1.30/install/include/d/std/functional.d) import std.conv (/root/usr/program/ldc/1.30/install/include/d/std/conv.d) import std.ascii (/root/usr/program/ldc/1.30/install/include/d/std/ascii.d) import std.range.interfaces (/root/usr/program/ldc/1.30/install/include/d/std/range/interfaces.d) import core.stdc.stdio (/root/usr/program/ldc/1.30/install/include/d/core/stdc/stdio.d) import core.stdc.stdint (/root/usr/program/ldc/1.30/install/include/d/core/stdc/stdint.d) import core.stdc.config (/root/usr/program/ldc/1.30/install/include/d/core/stdc/config.d) import core.stdc.signal (/root/usr/program/ldc/1.30/install/include/d/core/stdc/signal.d) import core.stdc.wchar_ (/root/usr/program/ldc/1.30/install/include/d/core/stdc/wchar_.d) import core.stdc.stdarg (/root/usr/program/ldc/1.30/install/include/d/core/stdc/stdarg.d) import core.stdc.time (/root/usr/program/ldc/1.30/install/include/d/core/stdc/time.d) import core.sys.posix.stdc.time (/root/usr/program/ldc/1.30/install/include/d/core/sys/posix/stdc/time.d) import core.sys.posix.sys.types (/root/usr/program/ldc/1.30/install/include/d/core/sys/posix/sys/types.d) import core.sys.posix.config (/root/usr/program/ldc/1.30/install/include/d/core/sys/posix/config.d) import core.sys.posix.stdio (/root/usr/program/ldc/1.30/install/include/d/core/sys/posix/stdio.d) import std.exception (/root/usr/program/ldc/1.30/install/include/d/std/exception.d) import core.stdc.errno (/root/usr/program/ldc/1.30/install/include/d/core/stdc/errno.d) import std.utf (/root/usr/program/ldc/1.30/install/include/d/std/utf.d) import core.exception (/root/usr/program/ldc/1.30/install/include/d/core/exception.d) import core.internal.string (/root/usr/program/ldc/1.30/install/include/d/core/internal/string.d) import std.algorithm.comparison (/root/usr/program/ldc/1.30/install/include/d/std/algorithm/comparison.d) import core.stdc.string (/root/usr/program/ldc/1.30/install/include/d/core/stdc/string.d) import std.format (/root/usr/program/ldc/1.30/install/include/d/std/format/package.d) import std.format.read (/root/usr/program/ldc/1.30/install/include/d/std/format/read.d) import std.format.internal.read (/root/usr/program/ldc/1.30/install/include/d/std/format/internal/read.d) import std.algorithm.searching (/root/usr/program/ldc/1.30/install/include/d/std/algorithm/searching.d) import std.bitmanip (/root/usr/program/ldc/1.30/install/include/d/std/bitmanip.d) import std.system (/root/usr/program/ldc/1.30/install/include/d/std/system.d) import core.bitop (/root/usr/program/ldc/1.30/install/include/d/core/bitop.d) import core.memory (/root/usr/program/ldc/1.30/install/include/d/core/memory.d) import core.time (/root/usr/program/ldc/1.30/install/include/d/core/time.d) import core.sys.posix.time (/root/usr/program/ldc/1.30/install/include/d/core/sys/posix/time.d) import core.sys.posix.signal (/root/usr/program/ldc/1.30/install/include/d/core/sys/posix/signal.d) import core.sys.posix.sys.time (/root/usr/program/ldc/1.30/install/include/d/core/sys/posix/sys/time.d) import core.sys.posix.sys.select (/root/usr/program/ldc/1.30/install/include/d/core/sys/posix/sys/select.d) import core.sys.linux.sys.time (/root/usr/program/ldc/1.30/install/include/d/core/sys/linux/sys/time.d) import core.sys.linux.config (/root/usr/program/ldc/1.30/install/include/d/core/sys/linux/config.d) import core.internal.array.utils (/root/usr/program/ldc/1.30/install/include/d/core/internal/array/utils.d) import core.checkedint (/root/usr/program/ldc/1.30/install/include/d/core/checkedint.d) import std.string (/root/usr/program/ldc/1.30/install/include/d/std/string.d) import std.uni (/root/usr/program/ldc/1.30/install/include/d/std/uni/package.d) import std.internal.unicode_tables (/root/usr/program/ldc/1.30/install/include/d/std/internal/unicode_tables.d) import core.internal.lifetime (/root/usr/program/ldc/1.30/install/include/d/core/internal/lifetime.d) import std.format.internal.floats (/root/usr/program/ldc/1.30/install/include/d/std/format/internal/floats.d) import std.math.operations (/root/usr/program/ldc/1.30/install/include/d/std/math/operations.d) import std.math (/root/usr/program/ldc/1.30/install/include/d/std/math/package.d) import std.math.algebraic (/root/usr/program/ldc/1.30/install/include/d/std/math/algebraic.d) import core.math (/root/usr/program/ldc/1.30/install/include/d/core/math.d) import core.stdc.math (/root/usr/program/ldc/1.30/install/include/d/core/stdc/math.d) import std.math.constants (/root/usr/program/ldc/1.30/install/include/d/std/math/constants.d) import std.math.exponential (/root/usr/program/ldc/1.30/install/include/d/std/math/exponential.d) import std.math.hardware (/root/usr/program/ldc/1.30/install/include/d/std/math/hardware.d) import core.stdc.fenv (/root/usr/program/ldc/1.30/install/include/d/core/stdc/fenv.d) import core.cpuid (/root/usr/program/ldc/1.30/install/include/d/core/cpuid.d) import std.math.remainder (/root/usr/program/ldc/1.30/install/include/d/std/math/remainder.d) import std.math.rounding (/root/usr/program/ldc/1.30/install/include/d/std/math/rounding.d) import std.math.traits (/root/usr/program/ldc/1.30/install/include/d/std/math/traits.d) import std.math.trigonometry (/root/usr/program/ldc/1.30/install/include/d/std/math/trigonometry.d) import std.internal.unicode_grapheme (/root/usr/program/ldc/1.30/install/include/d/std/internal/unicode_grapheme.d)
GC stats  0M used, 5M free, 5M total
code      app
/root/usr/program/gcc/9.5.0/install/bin/cc app.o -o app -L/root/usr/program/ldc/1.30/install/lib -lphobos2-ldc -ldruntime-ldc -Wl,--gc-sections -lrt -ldl -lpthread -lm -m32
```

The GCC compiler is built on `i686`:

```sh
# cc --version
cc (GCC) 9.5.0
```

At first I thought that I needed to rebuild the `GCC` compiler for the `i586` architecture. I downloaded GCC 9.5.0 and started the installation:

```sh
# cd source
# ./contrib/download_prerequisites
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.18.tar.bz2: OK
All prerequisites downloaded successfully.
# cd ..
# mkdir build && cd build
# ../source/config.sub i586-linux
i586-pc-linux-gnu
# ../source/configure --prefix=$PWD/../install_i586 --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++,d --target=i586-pc-linux-gnu --disable-multilib --with-multilib-list=m32
...
# make -j8
...
```

But during the installation process I got an error:

```sh
...
checking for suffix of object files... mv -f .deps/findcomp.Tpo .deps/findcomp.Plo configure: error: in `/root/source/gcc/9.5.0/build/i586-pc-linux-gnu/libgcc': configure: error: cannot compute suffix of object files: cannot compile
See `config.log' for more details
Makefile:14150: recipe for target 'configure-target-libgcc' failed
make[1]: *** [configure-target-libgcc] Error 1
make[1]: *** Waiting for unfinished jobs....
...
```

If I do it without a flag `--target=i586-pc-linux-gnu`, then everything is assembled without errors.

I'm at a dead end, please help, guys.

Reply via email to