Both sides previous revisionPrevious revisionNext revision | Previous revision |
ns32ktoolchain [2019/02/02 20:01] – [Binary format support] admin | ns32ktoolchain [2023/04/12 07:56] (current) – [Standalone binaries] admin |
---|
The **[[wp>GNU_toolchain|GNU Toolchain]]** is a collection of opensource software used for developing other software and OS-es. GNU Toolchain "by design" supports high portability and cross-compilation. It includes (among other tools) the **[[wp>GNU_Binutils|GNU Binutils]]** (assembler, linker e.t.c) and **GCC** (**[[wp>GNU Compiler Collection]]**: c, c++, fortran, ada e.t.c.). | The **[[wp>GNU_toolchain|GNU Toolchain]]** is a collection of opensource software used for developing other software and OS-es. GNU Toolchain "by design" supports high portability and cross-compilation. It includes (among other tools) the **[[wp>GNU_Binutils|GNU Binutils]]** (assembler, linker e.t.c) and **GCC** (**[[wp>GNU Compiler Collection]]**: c, c++, fortran, ada e.t.c.). |
| |
To run GNU Toolchain you have to use [[wp>Unix-like]] environment on real *NIX (Free/Net/Open-BSD Linux e.t.c.) with GNU tools pre-installed or UNIX-like environment like **[[wp>Cygwin]]** or **[[wp>MinGW]]+MSYS** for Windows. Virtual machine to run *NIX would be good too. | To run GNU Toolchain you have to use [[wp>Unix-like]] environment on real *NIX (Free/Net/Open-BSD Linux e.t.c.) with GNU tools pre-installed or UNIX-like environment like **[[wp>Cygwin]]** or **[[https://www.msys2.org/|MSYS2]]** for Windows. Virtual machine to run *NIX would be good too. |
| |
To support cross-compilation there are three system names that the building scripts knows about: the machine you are building on (''BUILD''), the machine that you are building for (''HOST''), and the machine that toolchain will produce code for (''TARGET''). When you configure toolchains, you specify these with ''--build='', ''--host='', and ''--target=''. | To support cross-compilation there are three system names that the building scripts knows about: the machine you are building on (''BUILD''), the machine that you are building for (''HOST''), and the machine that toolchain will produce code for (''TARGET''). When you configure toolchains, you specify these with ''--build='', ''--host='', and ''--target=''. |
==== Building binutils ==== | ==== Building binutils ==== |
| |
As it was noted above, the latest binutils still supports **ns32k** target. Early binutils versions (i.e. < ''binutils-2.13'' required for NetBSD compatibility) considered as "mature" and requires **GCC 3** to build. Something is broken in the **ns32k** binutils sources and it can't be built with **GCC 4** and above. | As noted above, the latest binutils still support **ns32k** target. Early binutils versions (i.e. < ''binutils-2.13'' required for NetBSD compatibility) considered as "mature" and requires **GCC 3** to build. Something is broken in the **ns32k** binutils sources and it can't be built with **GCC 4** and above. |
| |
Not-so-old (i.e. > ''binutils-2.20'' (correct me)) may be successfully compiled under **GCC 4**. | Not-so-old (i.e. > ''binutils-2.20'' (correct me)) may be successfully compiled under **GCC 4**. |
| |
Source download: http://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.bz2 | Binutils 2.27 source download link: http://ftp.gnu.org/gnu/binutils/binutils-2.27.tar.gz |
| |
If you have to build early ''binutils-2.13'', you have to use **GCC 3**, but this version deprecated and disappeared from the most of modern systems. You have to find or build a local **GCC 3** for your system (not covered by this document) or use a "compatibility" compiler pre-built for some systems. As an example, Redhat RHEL 5 and CENTOS 5 provide a "compat-gcc-34" package, MinGW provides "mingw32-gcc-v3-core" (correct me). FreeBSD 6 uses GCC 3 as system compiler and FreeBSD 7 provides gcc-3.4 (lang/gcc34) in the port collection. The latest Cygwin with system GCC 3 compiler was a Gygwin-1.5.25 and it may be obtained from the [[http://www.crouchingtigerhiddenfruitbat.org/Cygwin/timemachine.html|Cygwin Time Machine]] (see a cygwin-legacy). | If you need to build early ''binutils-2.13'', you have to use **GCC 3**, but this version deprecated and disappeared from the most of modern systems. You have to find or build a local **GCC 3** for your system (not covered by this document) or use a "compatibility" compiler pre-built for some systems. As an example, Redhat RHEL 5 and CENTOS 5 provide a "compat-gcc-34" package, MinGW provides "mingw32-gcc-v3-core" (correct me). FreeBSD 6 uses GCC 3 as system compiler and FreeBSD 7 provides gcc-3.4 (lang/gcc34) in the port collection. The latest Cygwin with system GCC 3 compiler was a Gygwin-1.5.25 and it may be obtained from the [[http://www.crouchingtigerhiddenfruitbat.org/Cygwin/timemachine.html|Cygwin Time Machine]] (see a cygwin-legacy). |
| |
Build results for various platforms: [[toolchain-build]] (not complete). | I've made a test build for various platforms: [[toolchain-build]] (not complete). |
| |
Like many other GNU software **GNU Toolchain** uses **GNU Autotools** scripts (./configure) to produce a correct ''Makefile'' for user's platform. | Like many other GNU software **GNU Toolchain** uses **GNU Autotools** scripts (./configure) to produce a correct ''Makefile'' for user's platform. |
(Example for Cygwin-1.5.25 with full build tools installed, running under Windows XP inside the VirtualBox) | (Example for Cygwin-1.5.25 with full build tools installed, running under Windows XP inside the VirtualBox) |
<code> | <code> |
tar jxf binutils-2.24.tar.bz2 | tar zxf binutils-2.27.tar.gz |
cd binutils-2.24 | cd binutils-2.27 |
./configure --prefix=/opt/cross --target=ns32k-pc532-netbsd --disable-nls | ./configure --prefix=/opt/cross --target=ns32k-pc532-netbsd --disable-nls |
make | make |
==== GNU as ==== | ==== GNU as ==== |
| |
GNU ''as'' (gas) has a slightly different syntax than the so-called TDS (Tiny Development System) and [[http://wiki.sensi.org/download/ns32k/as_refman.pdf|GENIX assembler]]. Be careful when porting your ns32k assembler files to gas. As an example, all hex constants should be written as 0x123456 not x'123456. Immediate values should not be prepended with ''$''. To access a variable as PC-relative use ''movd var(pc),r0'' istruction. Many assembler directives are different too. Consult a documentation : | GNU ''as'' (gas) has a slightly different syntax than so-called TDS (Tiny Development System) assembler and [[http://wiki.sensi.org/download/ns32k/as_refman.pdf|GENIX assembler]]. Be careful when porting your ns32k assembler files to gas. As an example, all hex constants should be written as 0x123456 not x'123456. Immediate values should not be prepended with ''$''. To access a variable as PC-relative use ''movd var(pc),r0'' istruction template. Many assembler directives are different too. Consult a documentation : |
| |
https://sourceware.org/binutils/docs/as/index.html | https://sourceware.org/binutils/docs/as/index.html |
| |
On the other hand, GNU ''as'' is just a "backend" for the GCC compiler and rarely used standalone. | On the other hand, GNU ''as'' is just a "backend" for the GCC compiler and rarely used standalone. An examples of the GNU ''as'' usage may be found in the NetBSD ns32k for the pc532 port: in the bootloader, kernel ans some libraries call optimized for speed. |
| |
GCC compiler has an interesting option ''-S'' to produce an assembly ''.s'' file from the ''.c''. Resulting files are fully compatible with ''gas''. Also GCC may pass an options to ''as'' with ''-Wa'' option. To produce an assembler listing with source code lines: | GCC compiler has an interesting option ''-S'' to produce an assembly ''.s'' file from the ''.c''. Resulting files are fully compatible with ''gas''. Also GCC may pass an options to ''as'' with ''-Wa'' option. To produce an assembler listing with source code lines: |
You have to extract NetBSD "include" directory before GCC building. | You have to extract NetBSD "include" directory before GCC building. |
| |
Download:\\ | Download NetBSD 1.5.3 includes and libraries:\\ |
ftp://ftp.netbsd.org/pub/NetBSD-archive/NetBSD-1.5.3/pc532/binary/sets/base.tgz\\ | https://archive.netbsd.org/pub/NetBSD-archive/NetBSD-1.5.3/pc532/binary/sets/base.tgz\\ |
ftp://ftp.netbsd.org/pub/NetBSD-archive/NetBSD-1.5.3/pc532/binary/sets/comp.tgz\\ | https://archive.netbsd.org/pub/NetBSD-archive/NetBSD-1.5.3/pc532/binary/sets/comp.tgz\\ |
<code> | <code> |
mkdir /tmp/NetBSD-1.5.3 | mkdir /tmp/NetBSD-1.5.3 |
Further reading: http://wiki.osdev.org/GCC_Cross-Compiler | Further reading: http://wiki.osdev.org/GCC_Cross-Compiler |
| |
| Precompiled binaries: http://wiki.sensi.org/download/ns32k/ns32k-netbsd-cross-i686-linux.tgz \\ |
| Includes binutils-2.27, gcc-3.4.6, NetBSD-1.5.3 headers. Prefix: ''/opt/cross'' \\ |
| Binaris are compiled with GCC-3 for the i686 arhitecture and tested on the modern 64-bit Centos 7 (RHEL 7) \\ |
| Since these are 32-bit -i686 binaries, install a ''glibc.i686'' package \\ |
| Just copy this TAR file to the root ''/'' and extract it with ''tar zxf'' \\ |
| Add an ''export PATH=/opt/cross/bin:$PATH'' |
| |
==== Standalone binaries ==== | ==== Standalone binaries ==== |
The option ''-ffreestanding'' disables "hosted" environment where ''main()'' is the first "user" function in the programm called by **crt0.o**. | The option ''-ffreestanding'' disables "hosted" environment where ''main()'' is the first "user" function in the programm called by **crt0.o**. |
| |
NOTE! GCC sometimes emits "built-in" functions like ''__udivdi3'' and requres "compiler runtime" library [[https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html|libgcc]] for target processor. | NOTE! GCC sometimes emits "built-in" functions like ''__udivdi3'' and requres "compiler runtime" library [[https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html|libgcc]] for target processor. Just smplify your arithmetic expressions to avoid this. |
| |
Another useful GCC option is ''-fomit-frame-pointer'' - it disables usage of the ''fp'' register (frame pointer) and use ''sp''-related (stack pointer) addressing for local variables like "old" compilers. GCC also supports ''-fpic'' option to compile PIC (Position-Independent Code) with ''sb''-related addressing ''0(_glblvar(sb))''. | Another useful GCC option is: ''-fomit-frame-pointer'' - it disables usage of the ''fp'' register (frame pointer) and use ''sp''-related (stack pointer) addressing for local variables like "old" compilers. GCC also supports ''-fpic'' option to compile PIC (Position-Independent Code) with ''sb''-related addressing ''0(_glblvar(sb))''. |
| |
Test object file with disassembler: | Test object file with disassembler: |
-Ttext 0x0 -M -Map emutest.map -o emutest.bin emutest.o | -Ttext 0x0 -M -Map emutest.map -o emutest.bin emutest.o |
</code> | </code> |
| GNU ld [[https://sourceware.org/binutils/docs/ld.pdf|documentation]] . |
| |
To check binary file: | To check binary file: |
<code> | <code> |
ns32k-pc532-netbsd-objdump.exe -D -x --target=binary -m ns32k emutest.bin | ns32k-pc532-netbsd-objdump.exe -D -x --target=binary -m ns32k emutest.bin |
</code> | </code> |
Run ''emul32k'' emulator: | Run ''emul32k'' emulator and binary file: |
<code> | <code> |
./emul32k emutest.bin | ./emul32k emutest.bin |
[[wp>GNU_Debugger|GNU Debugger]] provides an infrastructure for remote CPU debugging with various hardware probes and CPU testers. | [[wp>GNU_Debugger|GNU Debugger]] provides an infrastructure for remote CPU debugging with various hardware probes and CPU testers. |
| |
| ...Work in progress |
| |
| Sources: ftp://sourceware.org/pub/gdb/old-releases/ |
| |
| |
| GDB 2.5.1: no ns32k support. parsing ns32k COFF coffread.c \\ |
| GDB 2.8.1: initial ns32k support: m-merlin.h m-umax.h m-npl.h ns32k-opcode.h ns32k-pinsn.c coffread.c \\ |
| GDB 3.1: ns32k support: m-merlin.h m-umax.h m-npl.h ns32k-opcode.h ns32k-pinsn.c coffread.c \\ |
| GDB 3.3: the same, more instructions, bugs correction e.t.c. \\ |
| ... \\ |
| GDB 4.0.1: uses [[wp>Binary_File_Descriptor_library|BFD]] \\ |
| ...\\ |
| NetBSD 1.5.3 uses GDB 4.17\\ |
| ... \\ |
| GDB 5.1: Most ns32k hosts and targets have been marked as obsolete: ns32k-*-mach3* ns32k-umax-* ns32k-utek-sysv* ns32k-utek-*\\ |
GDB 6.4 dropped support for ns32k-*-* | GDB 6.4 dropped support for ns32k-*-* |
| |
...Work in progress | |
| |
==== Non-GNU Toolchains ==== | ==== Non-GNU Toolchains ==== |