Both sides previous revisionPrevious revisionNext revision | Previous revision |
ns32ktoolchain [2020/07/05 21:54] – [Building GCC] admin | ns32ktoolchain [2023/04/12 07:56] (current) – [Standalone binaries] admin |
---|
==== 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.gz | 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. |
==== 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-netbsd-cross-i686-linux.tgz \\ | 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 \\ | Includes binutils-2.27, gcc-3.4.6, NetBSD-1.5.3 headers. Prefix: ''/opt/cross'' \\ |
Binaris are compiled with GCC-3 for i686 arhitecture and tested on the modern Centos 7 (RHEL 7) \\ | Binaris are compiled with GCC-3 for the i686 arhitecture and tested on the modern 64-bit Centos 7 (RHEL 7) \\ |
Since this is 32-bit -i686 binaries, add a glibc.i686 pacgage \\ | Since these are 32-bit -i686 binaries, install a ''glibc.i686'' package \\ |
Just copy this TAR file to the root / and extract it witj tar zxf \\ | Just copy this TAR file to the root ''/'' and extract it with ''tar zxf'' \\ |
Add an export PATH=/opt/cross/bin:$PATH | 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 |
...Work in progress | ...Work in progress |
| |
ftp://sourceware.org/pub/gdb/old-releases/ | Sources: ftp://sourceware.org/pub/gdb/old-releases/ |
| |
GDB 2.5.1: no ns32k support. parsing ns32k COFF coffread.c \\ | GDB 2.5.1: no ns32k support. parsing ns32k COFF coffread.c \\ |
... \\ | ... \\ |
GDB 4.0.1: uses [[wp>Binary_File_Descriptor_library|BFD]] \\ | 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-*-* |
| |