Thanks for sharing this awesome project! When I try to run the binary, it is looking for a libharfbuzz.so.0, which does not exist:
[root@kindle us]# ./photoframe
./photoframe: error while loading shared libraries:
libharfbuzz.so.0: cannot open shared object file: No such file or directory
This happens on a Kindle Paperwhite (2015) with Firmware version 5.4.4.2.
I tried to re-use the lib files from KOreader, which seems to work, but I now get a crash that suggests an issue with the network polling (kernel supports it though: /proc/sys/fs/epoll/ has max_user_watches). It might be because Go has removed compatibility with kernel 2.6.
[root@kindle us]# ./photoframe https://foobar
runtime: epollwait on fd 4 failed with 38
fatal error: runtime: netpoll failed
runtime stack:
runtime.throw({0x2f5583, 0x17})
/usr/local/go/src/runtime/panic.go:1047 +0x4c fp=0x496e34bc sp=0x496e34a8 pc=0x4c7fc
runtime.netpoll(0x0)
/usr/local/go/src/runtime/netpoll_epoll.go:121 +0x414 fp=0x496e3d20 sp=0x496e34bc pc=0x484a4
runtime.sysmon()
/usr/local/go/src/runtime/proc.go:5362 +0x4ac fp=0x496e3d80 sp=0x496e3d20 pc=0x5c780
runtime.mstart1()
/usr/local/go/src/runtime/proc.go:1498 +0x7c fp=0x496e3d90 sp=0x496e3d80 pc=0x52ae8
runtime.mstart0()
/usr/local/go/src/runtime/proc.go:1455 +0x7c fp=0x496e3da4 sp=0x496e3d90 pc=0x52a5c
runtime.mstart()
/usr/local/go/src/runtime/asm_arm.s:210 +0x8 fp=0x496e3da8 sp=0x496e3da4 pc=0x81a78
goroutine 1 [running]:
goroutine running on other thread; stack unavailable
goroutine 2 [force gc (idle)]:
runtime.gopark(0x308c78, 0x4e62f8, 0x11, 0x14, 0x1)
/usr/local/go/src/runtime/proc.go:381 +0x100 fp=0x828fd8 sp=0x828fc4 pc=0x4ff3c
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.forcegchelper()
/usr/local/go/src/runtime/proc.go:305 +0xd4 fp=0x828fec sp=0x828fd8 pc=0x4fd5c
runtime.goexit()
/usr/local/go/src/runtime/asm_arm.s:831 +0x4 fp=0x828fec sp=0x828fec pc=0x83770
created by runtime.init.5
/usr/local/go/src/runtime/proc.go:293 +0x1c
goroutine 3 [GC sweep wait]:
runtime.gopark(0x308c78, 0x4e6610, 0xc, 0x14, 0x1)
/usr/local/go/src/runtime/proc.go:381 +0x100 fp=0x8297c8 sp=0x8297b4 pc=0x4ff3c
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.bgsweep(0x81c040)
/usr/local/go/src/runtime/mgcsweep.go:278 +0x94 fp=0x8297e4 sp=0x8297c8 pc=0x39ce0
runtime.gcenable.func1()
/usr/local/go/src/runtime/mgc.go:178 +0x28 fp=0x8297ec sp=0x8297e4 pc=0x29eec
runtime.goexit()
/usr/local/go/src/runtime/asm_arm.s:831 +0x4 fp=0x8297ec sp=0x8297ec pc=0x83770
created by runtime.gcenable
/usr/local/go/src/runtime/mgc.go:178 +0x74
goroutine 4 [GC scavenge wait]:
runtime.gopark(0x308c78, 0x4e68a0, 0xd, 0x14, 0x2)
/usr/local/go/src/runtime/proc.go:381 +0x100 fp=0x829fb4 sp=0x829fa0 pc=0x4ff3c
runtime.goparkunlock(...)
/usr/local/go/src/runtime/proc.go:387
runtime.(*scavengerState).park(0x4e68a0)
/usr/local/go/src/runtime/mgcscavenge.go:400 +0x64 fp=0x829fc8 sp=0x829fb4 pc=0x3707c
runtime.bgscavenge(0x81c040)
/usr/local/go/src/runtime/mgcscavenge.go:628 +0x3c fp=0x829fe4 sp=0x829fc8 pc=0x37940
runtime.gcenable.func2()
/usr/local/go/src/runtime/mgc.go:179 +0x28 fp=0x829fec sp=0x829fe4 pc=0x29e98
runtime.goexit()
/usr/local/go/src/runtime/asm_arm.s:831 +0x4 fp=0x829fec sp=0x829fec pc=0x83770
created by runtime.gcenable
/usr/local/go/src/runtime/mgc.go:179 +0xbc
goroutine 5 [finalizer wait]:
runtime.gopark(0x308bb8, 0x4f78ac, 0x10, 0x14, 0x1)
/usr/local/go/src/runtime/proc.go:381 +0x100 fp=0x82878c sp=0x828778 pc=0x4ff3c
runtime.runfinq()
/usr/local/go/src/runtime/mfinal.go:193 +0xfc fp=0x8287ec sp=0x82878c pc=0x28dc4
runtime.goexit()
/usr/local/go/src/runtime/asm_arm.s:831 +0x4 fp=0x8287ec sp=0x8287ec pc=0x83770
created by runtime.createfing
/usr/local/go/src/runtime/mfinal.go:163 +0x5c
When using Go 1.18 and re-adding epoll_wait, this seems to work again. I just need to set up a working cross-compilation environment for Go.