lcat
My personal /var/log
  • Home
  • Contact
  • HackMe!

Logbook cross-compiling dari Linux untuk FreeBSD

Motivasi awal melakukan cross-compiling ini adalah karena saya ingin mencoba menulis ulang blog ini menggunakan Rust. Ide ini terhenti sebentar setelah sadar bahwa NFSN, perusahaan hosting blog saya sekarang, menggunakan host FreeBSD 14.3.

### 2025-08-11

Saya sebenarnya sudah berhasil cross-compiling dengan bantuan [cross](https://github.com/cross-rs/cross). Tapi rasanya seperti jalan pintas dan saya juga masih belum paham apa yang sebenarnya terjadi. Akhirnya saya memutuskan untuk mencoba cross-compiling sendiri tanpa Docker dan cross.

Saya baca salah satu komentar di [sini](https://users.rust-lang.org/t/build-rustc-properly-for-cross-targets-linux-freebsd/38059) untuk langsung coba dengan `rustup target add x` lalu `cargo build --target x`, namun tidak langsung bisa. Ada error gagal menemukan `libexecinfo` yang ternyata setelah saya pelajari adalah library yang ada di FreeBSD.

### 2025-08-12

Saya banyak browsing-browsing.. sepertinya perlu mengunduh sysroot FreeBSD, saya coba ambil dari [sini](https://download.freebsd.org/ftp/releases/amd64/14.3-RELEASE/). Untuk kompilasi sepertinya perlu override build script yang dimention di [sini](https://rust-lang.github.io/rustup/cross-compilation.html). Awalnya saya coba mengubah `rustflags` pada `~/.cargo/config.toml` untuk menambah `-L ~/opt/freebsd-sysroot/lib`. Meski terlihat berhasil, sepertinya saya mengacaukan proses compile-nya. Yang benar adalah menambahkan opsi `-C link-arg=--sysroot=/home/cat/freebsd-14.3-sysroot`. Namun, ini masih belum berhasil karena gagal di proses linking, beberapa hal tidak berhasil ditemukan oleh linker.

Salah satu bacaan yang saya temukan menarik adalah yang dari [OS Dev Wiki tentang GCC Cross-Compiler](https://wiki.osdev.org/GCC_Cross-Compiler). Saya jadi baca-baca artikel wiki lainnya, misalnya yang membahas System V ABI, red zone pada x86-64, sistem penamaan target triplet yang ambigu.

### 2025-08-12

Saya menemukan [artikel menarik](https://marcelog.github.io/articles/cross_freebsd_compiler_in_linux.html) tentang cross-compiling ke FreeBSD dari Linux. Sedang saya coba ikuti, mulai dari proses build binutils dan gcc. Menarik ya.. compiling a compiler :))

Sudah berhasil compile binutils (ketika configure, yang paling menarik mungkin adalah opsi `--target`). Sekarang mau coba langsung compile GCC, ternyata memang perlu GMP, MPFR, dan MPC. Saya ragu kalau saya configure build gcc tanpa compile dulu untuk GMP, MPFR, dan MPC, jadi saya stick to the tutorial saja.

Sebelum bisa compile, di tutorial *Following the GNU toolchain convention*, perlu membuat direktori `$prefix/x86_64-unknown-freebsd` dulu. Saya kutip ulang yang dikutip artikelnya.

> By convention, the GNU toolchain will store all its data in ${prefix}/${target} where the prefix is the installation prefix for the toolchain (i.e: /usr) and target is the name of the target for which this toolchain generates binaries (i.e: /usr/x86_64-pc-freebsd7, /usr/x86_64-pc-linux-gnu, etc). Also, the names for the linker, compiler, etc, will be named in the form ${target}-gcc, ${target}-ar, ${target}-ld, etc. So you can have multiple toolchains for multiple targets residing in the same prefix installation directory. Inside each target directory, you would find /include, /lib, and /bin which helps to keep things clear, since each target has its own specific libraries, includes, stubs for executables, etc.

Saya sudah berhasil compile dan install semua dependensi GCC yaitu GMP, MPFR, dan MPC. Saya coba untuk configure GMP, MPFR, dan MPC dengan tidak mengikuti tutorial, tapi hanya dengan `--prefix $prefix` (dalam kasus saya, prefix adalah `/home/cat/opt/cross-freebsd`) dan `--host=x86_64-unknown-freebsd`. Sekarang, ketika compile GCC, configure-nya juga mirip, tapi `--host` diganti `--target`, sama ketika mengkompilasi binutils. Kalau untuk GCC, saya harus menspesifikkan target ke major version FreeBSD-nya, sehingga menjadi `x86_64-unknown-freebsd14`. Semoga ini tidak mengharuskan saya mengulang dari awal karena sejak awal tanpa suffix `14` :)

### 2025-08-13

Hari sudah berganti. GCC sedang compiling, kata Google sekitar 10-15 menit.. mungkin harus ditinggal istirahat dulu 😁. Malam ini saya belajar banyak hal dan sepertinya masih banyak yang masih belum sepenuhnya bisa saya pahami. Beberapa di antaranya adalah konsep soal linker, proses build untuk program C menggunakan configure, m4, dan kawan-kawannya yang asing saya lihat.

^ Later discovered: Ternyata build/distribution system yang dipakai adalah GNU autotools. Dari review yang saya baca, GNU autotools ini katanya lumayan robust dan fleksibel. Semoga bisa saya coba di masa depan.

### 2025-08-14

Saya sudah agak luang. Namun compile GCC belum juga berhasil meski sudah saya ulang dengan target triplet yang benar `x86_64-unknown-freebsd14`. Entah apa yang salah, saya sudah set `LD_LIBRARY_PATH` dengan benar.
 
```
/home/cat/opt/cross-freebsd/x86_64-unknown-freebsd14/bin/ld: cannot find /lib/libc.so.7: No such file or directory
/home/cat/opt/cross-freebsd/x86_64-unknown-freebsd14/bin/ld: cannot find /usr/lib/libc_nonshared.a: No such file or directory
collect2: error: ld returned 1 exit status
make[2]: *** [Makefile:1009: libgcc_s.so] Error 1
make[2]: Leaving directory '/home/cat/opt/cross-freebsd/scratch/gcc-15.2.0/build/x86_64-unknown-freebsd14/libgcc'
make[1]: *** [Makefile:14309: all-target-libgcc] Error 2
make[1]: Leaving directory '/home/cat/opt/cross-freebsd/scratch/gcc-15.2.0/build'
make: *** [Makefile:1061: all] Error 2
```

Saya akan coba ulang lagi dari awal, kali ini mengikuti [tutorial ini](https://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/).
Mungkin ada yang membaca post ini lalu dalam hatinya menyarankan "kenapa gak chatgpt aja?" Saya rasa saya jelek sekali dalam *prompting*, karena bertanya ke ChatGPT malah membuat saya semakin bingung 🥲. Saya baru tahu dari tutorial yang saya ikuti ini, bahwa tidak perlu meng-compile GMP, MPFR, dan MPC satu per satu, melainkan bisa sekalian dengan GCC asalkan dibuatkan salinan/symlink dulu di source dir GCC. Saya juga baru tahu setelah baca-baca dari [dokumentasi GCC](https://gcc.gnu.org/install/download.html), kalau binutils juga bisa sekalian di-build :)

> If you also intend to build binutils (either to upgrade an existing installation or for use in place of the corresponding tools of your OS), unpack the binutils distribution either in the same directory or a separate one. In the latter case, add symbolic links to any components of the binutils you intend to build alongside the compiler (bfd, binutils, gas, gprof, ld, opcodes, …) to the directory containing the GCC sources.

> Likewise the GMP, MPFR, MPC and Gettext libraries can be automatically built together with GCC. You may simply run the contrib/download_prerequisites script in the GCC source directory to set up everything. Otherwise unpack the GMP, MPFR, MPC and/or Gettext source distributions in the directory containing the GCC sources and rename their directories to gmp, mpfr, mpc and gettext, respectively (or use symbolic links with the same name).

Setelah menunggu sekitar setengah jam.. **it's a success**! Ternyata tidak perlu juga provide `LD_LIBRARY_PATH`. Mungkin saja pada step sebelumnya saya gagal karena ada hal minor yang miss contohnya typo/salah eja. Atau mungkin karena kali ini target `make` saya adalah `all-gcc` bukan `make` saja (default target). Kalau dirangkum, history command saya kurang lebih seperti ini.

```fish
set -x PREFIX $HOME/opt/cross
set -x TARGET x86_64-unknown-freebsd14

# setup sources to compile
mkdir cross-freebsd-src
cd cross-freebsd-src
wget all binutils and all gcc dependencies (GMP, MPFR, MPC) -> shortcut: use contrib/download_prerequisites
for f in *.tar.*; tar xvf $f; end

# copy downloaded freebsd14.3 sysroot to $PREFIX/$TARGET
cp -r path/to/freebsd14.3-sysroot/* $PREFIX/$TARGET/

# compile binutils
cd binutils-2.45/
mkdir build
cd build
../configure --prefix=$PREFIX --target=$TARGET --disable-multilib
make -j(nproc)
make install

# compile gcc
cd ../gcc-15.2.0/
ln -s ../mpfr-4.2.2 mpfr
ln -s ../gmp-6.3.0 gmp
ln -s ../mpc-1.3.1 mpc
mkdir build
cd build
../configure --prefix=$PREFIX --target=$TARGET --disable-multilib --enable-languages=c,c++
make -j(nproc) all-gcc
make install-gcc
```


Ternyata ini masih belum selesai, saya masih belum bisa meng-compile program hello world sederhana karena tidak ada header standar seperti `stdio.h`. Mungkin ini karena target yang `all-gcc`. Karena next step di tutorialnya agak panjang, saya akan coba `make` biasa, kalau tidak bisa, saya akan ikuti sesuai tutorial. Gagal.

Setelah baca lebih cermat, di tutorial ini ternyata sudah dibahas:

> All of the remaining steps involve building GCC and Glibc. The trick is that there are parts of GCC which depend on parts of Glibc already being built, and vice versa. We can’t build either package in a single step; we need to go back and forth between the two packages and build their components in a way that satisfies their dependencies.

![ilustrasi di web preshing.com](https://preshing.com/images/cross-gcc-steps.png)

Setelah baca-baca lagi, ternyata di FreeBSD tidak pakai Glibc, itu sebabnya saya gagal compile Glibc. Saya juga baru ingat kalau sysroot FreeBSD 14.3 yang saya download sudah include pre-compiled libc. Setelah berbagai percobaan dan membaca [artikel SO ini](https://stackoverflow.com/questions/23011367/arm-linux-gnu-gcc-fatal-error-stdio-h-no-such-file-or-directory), saya berhasil compile hello world.

![hasil cross-compile dan run hello world](data:image/avif;base64,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)

Selanjutnya, saya akan coba mengkonfigurasi config cargo untuk menggunakan gcc yang sudah dicompile sebagai linker. Isi file `~/.cargo/config.toml` saya sebagai berikut.

```toml
[target.x86_64-unknown-freebsd]
linker = "/home/cat/opt/cross/bin/x86_64-unknown-freebsd14-gcc"
rustflags = [
  "-C",
  "link-arg=--sysroot=/home/cat/opt/cross/x86_64-unknown-freebsd14",
]
```

Untuk program hello world, kompilasi berjalan lancar. Namun, ketika mencoba cross compile program untuk blog ini yang menggunakan library `rusqlite`, kompilasinya gagal. Sebabnya adalah karena pustaka `rusqlite` melakukan kompilasi sendiri yang terpisah ketika proses build menggunakan [pustaka cc-rs](https://docs.rs/cc/latest/cc/). Menambahkan environment variable CFLAGS membuat kompilasi berhasil.

```
env CFLAGS="--sysroot=$SYSROOT -I $SYSROOT/usr/include" cargo build --target=x86_64-unknown-freebsd
```

### Penutup

Terima kasih untuk pembaca, jika ada, yang membaca sampai akhir coret-coretan saya. Ternyata, tidak mudah untuk melakukan cross compiling, terutama jika harus build semuanya from source. Berikutnya saya akan menggunakan tool-tool pembantu seperti [cross-rs](https://github.com/cross-rs/cross) atau cross-compiler native saja agar tidak repot. Setidaknya sudah pernah mencoba. Mungkin lain kali saya akan mencoba mengkompilasi Glibc yang saat ini tidak saya butuhkan.

#### Notes

- **Luangkan waktu untuk membaca dokumentasi** sebelum mengikuti tutorial, misalnya untuk memahami target `make` yang tersedia atau flag-flag yang diterima ketika melakukan konfigurasi build (misalnya dengan `./configure`)
- Untuk meminimalkan kesalahan karena typo, gunakan environment variable, misalnya untuk `PREFIX`, `TARGET`, dan `SYSROOT`
- Kompilasi `gcc` sebaiknya dilakukan dengan `make all-gcc` saja karena target default sepertinya punya efek samping, misalnya membutuhkan Glibc yang tidak kita punya jika melakukan cross-compiling
- Proses build `gcc` bisa dilakukan dalam waktu yang lebih sedikit, dengan meringkas tahapan mendownload dan build dependensi, yaitu dengan bantuan script [contrib/download_prerequisites](https://gcc.gnu.org/wiki/InstallingGCC)
Created: 2025-08-12 15:54:49, Updated: 2025-08-14 13:09:43, ID: b62da227-754a-4a51-82c7-520e5d0e76a6