Skip to content

Instantly share code, notes, and snippets.

@InfiniteCoder01
Last active December 10, 2024 17:21
Show Gist options
  • Save InfiniteCoder01/7a80043cae6fe041ec7df024817091be to your computer and use it in GitHub Desktop.
Save InfiniteCoder01/7a80043cae6fe041ec7df024817091be to your computer and use it in GitHub Desktop.
Tiny init system to use with Android kernel

This is a tiny init system, which in combination with the original kernel can be used to build a "functional GNU/Linux system". Can be used with pretty much any android system

Usage

Get aarch64-none-linux-gnu cross-compiler toolchain (for example here). Compile init using aarch64-none-linux-gnu-gcc init.c -o init -static Repack boot.img (or a TWRP recovery) using Android boot image editor Profit!

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
#include <linux/kd.h>
#include <unistd.h>
void fpwrite(const char *f, const char *s) {
FILE *fi = fopen(f, "w");
if (!fi) {
return;
}
fprintf(fi, "%s", s);
fclose(fi);
}
int main() {
mkdir("/dev", 0755);
mkdir("/proc", 0755);
mkdir("/sys", 0755);
mount("devtmpfs", "/dev", "devtmpfs", MS_NOSUID, "mode=0755");
mount("proc", "/proc", "proc", 0, NULL);
mount("sysfs", "/sys", "sysfs", 0, NULL);
fpwrite("/sys/class/android_usb/android0/enable", "0");
fpwrite("/sys/class/android_usb/android0/idVendor", "18d1");
fpwrite("/sys/class/android_usb/android0/idProduct", "4ee2");
fpwrite("/sys/class/android_usb/android0/functions", "acm");
fpwrite("/sys/class/android_usb/android0/f_acm/instances", "1");
fpwrite("/sys/class/android_usb/android0/enable", "1");
fpwrite("/sys/class/android_usb/android0/iManufacturer", "Xiaomi");
fpwrite("/sys/class/android_usb/android0/iProduct", "Redmi");
fpwrite("/sys/class/android_usb/android0/iSerial", "0123456789ABCDEF");
{
mknod("/dev/ttyGS0", 0777 | S_IFCHR, makedev(233, 0));
int fd;
if ((fd = open("/dev/ttyGS0", O_RDWR)) < 0) {
fd = open("/dev/null", O_RDWR);
}
ioctl(fd, TIOCSCTTY, 0);
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
}
symlink("/dev/ttyGS0", "/dev/console");
setenv("LD_LIBRARY_PATH", "/lib:/usr/lib:/sbin", 1);
setenv("PATH", "/usr/sbin:/usr/bin:/sbin:/bin", 1);
execl("/sbin/sh", "/sbin/sh", NULL);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment