DEV Community

loading...

Running Zig binaries on a KaiOS device

cryptocode
Coding things
・2 min read

Running Zig binaries on KaiOS devices

The goal here is to a) cross-compile a Zig program and b) root a KaiOS device, and then install and run the cross-compiled program on the device.

We're not making a GUI app or anything here, just a small "Hello world" program that we'll cross-compile and run on the device. All sorts of interesting things can be done from this point on.

I'm using Android's adb to push files to the device and to get a shell, so you'll have to install that first if you wanna follow along.

Make a Hello World program in Zig

const std = @import("std");

pub fn main() !void {
    const stdout = std.io.getStdOut().writer();
    try stdout.print("Hello from Zig!\n", .{});
}
Enter fullscreen mode Exit fullscreen mode

Save as main.zig

Cross-compile

Zig makes it trivial to cross-compile for the ARM Cortex A7:

zig build-exe -target arm-linux-musleabihf -femit-bin=zigapp main.zig
Enter fullscreen mode Exit fullscreen mode

Root the device

The recipe here is going to be different for each device type. I'm using a Nokia 2720 Flip for testing, which is easy to root with wallace-light:

NOTE: I used OmniSD to perform a priviledged reset long before making this post. I'm not sure if it's necessary or not for Wallace Light to work. If the recipe below doesn't work, try installing OmniSD and do a reset; it's easy enough [2].

  1. Put your KaiOS device in debug mode, typically using *#*#33284#*#* (which spells debug - a bug icon should appear in the status line if it works)

  2. Deploy Wallace Light [1]

adb forward tcp:6000 localfilesystem:/data/local/debugger-socket
npm i -g @filipe_x3/kdeploy
kdeploy -i ~/Downloads/wallace-lite-0.1/application

Enter fullscreen mode Exit fullscreen mode

Now start Wallace Light on the device and click ROOT ME.

Next, I'm pushing the cross-compiled Zig binary to the device's sdcard:

adb push zigapp /sdcard

Enter fullscreen mode Exit fullscreen mode

Now we need to jump into the device through a shell:

adb shell
Enter fullscreen mode Exit fullscreen mode

We're now in a terminal session on the device, but most likely on a read-only file system. Let's fix that:

mount -o rw,remount /system
Enter fullscreen mode Exit fullscreen mode

Next, move the binary from /sdcard to /system/bin and make it executable:

cp /sdcard/zigapp /system/bin
chmod +x /system/bin/zigapp
Enter fullscreen mode Exit fullscreen mode

Now we can run it!

/system/bin/zigapp
Enter fullscreen mode Exit fullscreen mode

Result as expected:

Hello from Zig!
Enter fullscreen mode Exit fullscreen mode

[1] I used Wallace Light from https://sites.google.com/view/bananahackers/root/temporary-root#h.sb1y1p9fj906

Unzip it, then unzip the contained application.zip, which is what we're deploying above.

[2] https://sites.google.com/view/bananahackers/install-omnisd

Discussion (1)

Collapse
fergarram profile image
Fernando Garcia

This is really cool! I definitely need to try this out.