mirror of
https://github.com/n64decomp/sm64.git
synced 2024-11-14 05:15:09 -05:00
67 lines
1.9 KiB
Markdown
67 lines
1.9 KiB
Markdown
|
# Static Recompilation of IRIX Programs
|
||
|
|
||
|
Convert selected IRIX C toolchain programs into modern Linux or macOS programs
|
||
|
|
||
|
## Supported Programs
|
||
|
|
||
|
* IDO 5.3
|
||
|
* cc, acpp, as0, as1, cfe, copt, ugen, ujoin, uld, umerge, uopt, usplit, ld, strip, upas
|
||
|
* IDO 7.1
|
||
|
* cc, acpp, as0, as1, cfe, ugen, ujoin, uld, umerge, uopt, usplit, upas
|
||
|
|
||
|
## Dependencies
|
||
|
|
||
|
### Linux (Debian / Ubuntu)
|
||
|
|
||
|
```bash
|
||
|
sudo apt-get install build-essential
|
||
|
```
|
||
|
|
||
|
### macOS
|
||
|
|
||
|
[Install homebrew](https://brew.sh/) and then:
|
||
|
|
||
|
```bash
|
||
|
brew install make
|
||
|
```
|
||
|
|
||
|
## Building
|
||
|
|
||
|
First build the recomp binary itself
|
||
|
|
||
|
```bash
|
||
|
make setup
|
||
|
```
|
||
|
|
||
|
```bash
|
||
|
make VERSION=5.3
|
||
|
make VERSION=7.1
|
||
|
```
|
||
|
|
||
|
The build artifacts are located in `build/{7.1|5.3}/out`. Add `-j{thread num}` for multithreaded building.
|
||
|
|
||
|
By default, debug builds are created with less optimizations, debug flags, and unstripped binaries.
|
||
|
Add `RELEASE=1` to build release builds with optimizations and stripped binaries.
|
||
|
|
||
|
### Creating Universal ARM/x86_64 macOS Builds
|
||
|
|
||
|
By default, make build script create native binaries on macOS. This was done to minimize the time to build the recompiled suite.
|
||
|
In order to create "fat," universal ARM and x86_64, pass `TARGET=universal` to `gmake`.
|
||
|
|
||
|
### Manual Building
|
||
|
|
||
|
Example for compiling `as1` in a Linux environment:
|
||
|
|
||
|
```bash
|
||
|
make -C tools/rabbitizer
|
||
|
g++ -Itools/rabbitizer/include -Itools/rabbitizer/cplusplus/include recomp.cpp -o recomp.elf -g -Ltools/rabbitizer/build -lrabbitizerpp
|
||
|
./recomp.elf ido/7.1/usr/lib/as1 > as1_c.c
|
||
|
gcc libc_impl.c as1_c.c -o as1 -g -fno-strict-aliasing -lm -DIDO71
|
||
|
```
|
||
|
|
||
|
Use the same approach for `cc`, `cfe`, `uopt`, `ugen`, `as1` (and `copt` if you need that).
|
||
|
|
||
|
Use `-DIDO53` instead of `-DIDO71` if the program you are trying to recompile was compiled with IDO 5.3 rather than IDO 7.1.
|
||
|
|
||
|
To compile `ugen` for IDO 5.3, add `--conservative` when invoking `./recomp.elf`. This mimics UB present in `ugen53`. That program reads uninitialized stack memory and its result depends on that stack memory.
|