Here's a "hello world" bare metal ELF kernel for j-core which the ROM bootloader can load, relocate, and run. The source (hello.c) is:

void uartlite_read(volatile unsigned *uart, unsigned char *buf, int len)
{
	while (len--) {
		while (!(uart[2]&1));
		*buf++ = *uart;
	}
}

void uartlite_write(volatile unsigned *uart, char *s, int len)
{
	while (len--) {
		while ((uart[2]&8));
		uart[1] = *s++;
	}
}

void _start()
{
	volatile unsigned *ul0 = (void *)0xabcd0100;
	char *s = "hello world\r\n", c;

	uartlite_write(ul0, s, 13);
	for (;;) {
		uartlite_read(ul0, &c, 1);
		if (c>='a' && c<='z') c -= 32;
		uartlite_write(ul0, &c, 1);
	}
}

Which is cross compiled via:

sh2eb-linux-muslfdpic-gcc -Os -nostartfiles -nostdlib -mno-fdpic -Wl,-Ttext-segment=0x10000000 hello.c -o vmlinux

Copy the resulting vmlinux file to the sd card and reboot the board to see it in action. This should produce an 872 byte bare metal ELF binary (532 bytes stripped) which prints "hello world" to the serial port and then echoes back its input (converted to uppercase). It reads/writes the serial port by spinning on the registers (wait for data/space, read or write next byte). It does not set the serial port speed (the bootloader left it at 115200).