This guide should help you with cross-compiling other software as well (at least give you some pointers if you’re new to this).

So, I got a Synology NAS. It’s a Linux box running on x86_64 (AKA AMD64), but it has no nano. My laptop is a Mac, running on aarch64 (AKA ARM64).

So, I decided to fire up an Ubuntu (20.04) VM on my laptop, and statically cross-compile nano, to get a single binary I could just drop into my NAS.

Installing the compiler and libraries

sudo apt install build-essential gcc-x86-64-linux-gnu libncurses-dev

However, to statically compile this, we also need the x86_64 version of the library installed (which will then be “packed” into the final binary, that’s how static compiling works).

Create the file /etc/apt/sources.list.d/amd64.list with the following content:

deb [arch=amd64] http://security.ubuntu.com/ubuntu/ focal-security  main restricted universe multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/  focal           main restricted universe multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/  focal-updates   main restricted universe multiverse
deb [arch=amd64] http://archive.ubuntu.com/ubuntu/  focal-backports main restricted universe multiverse

Make sure to replace “focal” with whatever distro you are using. These are the Ubuntu repos for amd64 (x86_64), which we need to obtain the amd64 version of packages.

Now update the package list and add the architecture:

sudo apt update
sudo dpkg --add-architecture amd64
sudo apt update

Now install the x86_64 version of libncurses-dev:

sudo apt install libncurses-dev:amd64

That should be all, let’s continue!

Getting the source and building

wget https://www.nano-editor.org/dist/v6/nano-6.2.tar.xz
tar xf nano-6.2.tar.xz
cd nano-6.2/
CC=x86_64-linux-gnu-gcc ./configure --host x86_64 CFLAGS="-O2 -Wall --static"
make

Now when we run find . -name nano we will find exactly one binary built at src/nano.

Let’s verify that it built as x86_64, and that it’s statically linked:

file src/nano

Which outputs:

src/nano: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=838510eaef96345242a4e9adcc29001a8722f1af, for GNU/Linux 3.2.0, not stripped

We can see “x86-64” and “statically linked”. Sounds good! Deploy it on your x86_64 NAS on /usr/local/bin to install nano system-wide. You can do that with SCP. Make sure to test it, though.

I find it amusing, BTW. Usually one is on x86_64, cross-compiling for an embedded device running aarch64… But this time, it’s the other way around. (:

Either way, no more VIM! :D

If this guide helped you out, consider donating a coffee. (: