[SOLVED]: SilverBullet Linux binary releases not working (on Alpine)

I use SilverBullet on Alpine Linux using an untrusted LXC container. When I attempt to execute SilverBullet using the 2.x binary releases, they exit with “No such file or directory.”

On using silverbullet using arguments version or -h,

/usr/local/bin # /usr/local/bin/silverbullet-2.3.0-bin -h
sh: /usr/local/bin/silverbullet-2.3.0-bin: not found

Yet, it obviously exists.

/usr/local/bin # ls -l /usr/local/bin/silverbullet-2.3.0-bin
-rwxr-xr-x    1 root     root      22913622 Nov 24 09:48 /usr/local/bin/silverbullet-2.3.0-bin

and

/usr/local/bin # stat /usr/local/bin/silverbullet-2.3.0-bin
  File: /usr/local/bin/silverbullet-2.3.0-bin
  Size: 22913622        Blocks: 28945      IO Block: 131072 regular file
Device: 2eh/46d Inode: 73762       Links: 1
Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-11-24 19:23:26.311504847 +0000
Modify: 2025-11-24 09:48:49.000000000 +0000
Change: 2025-11-24 19:23:11.935400241 +0000

I am perplexed to say the least. Any thoughts?


Keeping below for completeness but the test is flawed seeing how I cannot even silverbullet -h without error.


Testing

Operating system

I use Alpine Linux edge due to compile requirements.

/usr/local/bin # cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.23.0_alpha20251016
PRETTY_NAME="Alpine Linux edge"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"

User account

I do not use root, typically, but for testing its root.

/usr/local/bin # whoami
root

New space directory

/usr/local/bin # stat /tmp/sbtest00
  File: /tmp/sbtest00
  Size: 2               Blocks: 1          IO Block: 131072 directory
Device: 2eh/46d Inode: 73755       Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-11-24 17:20:46.490442126 +0000
Modify: 2025-11-24 17:20:46.490442126 +0000
Change: 2025-11-24 17:20:46.490442126 +0000

Release binary execution

Downloading the current linux-x86_64 binary release and executing results with:

/usr/local/bin # strace -o /tmp/sb-bin.log /usr/local/bin/silverbullet-2.3.0-bin /tmp/sbtest00
strace: exec: No such file or directory

and the strace log:

/usr/local/bin # tail /tmp/sb-bin.log
execve("/usr/local/bin/silverbullet-2.3.0-bin", ["/usr/local/bin/silverbullet-2.3."..., "/tmp/sbtest00"], 0x7ffdec8474f8 /* 10 vars */) = -1 ENOENT (No such file or directory)
+++ exited with 1 +++

Compiled binary execution

In contrast, using the compiled binary results with:

/usr/local/bin # strace -o /tmp/sb-bin.log /usr/local/bin/silverbullet-2.3.0 /tmp/sbtest00
2025/11/24 17:59:33 SilverBullet will only be available locally, to allow outside connections, pass -L0.0.0.0 as a flag, and put a TLS terminator on top.
2025/11/24 17:59:33 Local shell command execution enabled for ALL commands.
2025/11/24 17:59:33 Index page index.md does not yet exist, creating...
2025/11/24 17:59:33 Config page CONFIG.md does not yet exist, creating...
2025/11/24 17:59:33 SilverBullet is now running: http://localhost:3000

This has been consistent challenge when executing the 2.1.9, 2.2.1, and 2.3.0 linux x86_64 binary releases.

I don’t know much about Alpine linux, or running silverbullet in an LXC container, but when I run silverbullet I pass it a directory name, not a temp file. Have you tried a directory rather than a file?

I assume you are referencing strace -o /tmp/sb-bin.log /usr/local/bin/silverbullet-2.3.0-bin /tmp/sbtest00, the directory /tmp/sbtest00 is being passed to SilverBullet.

techore in silverbullet in ~ _ stat /tmp/sbtest00
  File: /tmp/sbtest00
  Size: 4               Blocks: 1          IO Block: 131072 directory
Device: 2eh/46d Inode: 73755       Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-11-26 05:51:43.659164292 +0000
Modify: 2025-11-24 17:59:33.238904006 +0000
Change: 2025-11-24 17:59:33.238904006 +0000

You may be looking at strace -o /tmp/sb-bin.log where sb-bin.log is a file. The -o argument redirects strace’s stderr output to file.

techore in silverbullet in ~ _ stat /tmp/sb-bin.log
  File: /tmp/sb-bin.log
  Size: 28797           Blocks: 17         IO Block: 29184  regular file
Device: 2eh/46d Inode: 73752       Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2025-11-24 17:24:16.405030103 +0000
Modify: 2025-11-24 18:00:12.490192587 +0000
Change: 2025-11-24 18:00:12.490192587 +0000

On linux, strace can be useful in debugging or troubleshooting.

https://linux.die.net/man/1/strace

Brad, I appreciate you asking for clarification and did I assume correctly?

I have spent an embarassing amount of time trying to figure out what I am missing. Most likely, the problem is me not SilverBullet and it will be something small, silly, and embarrassing. :slight_smile:

This problem looked familiar so I looked into it and also tried this in an LXC container on Alpine. The odd thing is that SilverBullet’s default docker containers are also running on Alpine, so I wouldn’t have expected to be a problem.

Anyway, the problem is this: linux - Docker Alpine executable binary not found even if in PATH - Stack Overflow

The SilverBullet binary is built against libc:

alpine-test:~# ldd silverbullet
        /lib64/ld-linux-x86-64.so.2 (0x7efae94a3000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7efae94a3000)
Error relocating silverbullet: __vfprintf_chk: symbol not found
Error relocating silverbullet: __fprintf_chk: symbol not found

The fix is to install the libc6-compat package in Alpine:

alpine-test:~# apk add libc6-compat
(1/3) Installing musl-obstack (1.2.3-r2)
(2/3) Installing libucontext (1.3.2-r0)
(3/3) Installing gcompat (1.1.0-r4)
OK: 14 MiB in 44 packages

Then it runs fine

@zef, thank you!

techore in silverbullet in ~ _ doas apk add libc6-compat
doas (techore@silverbullet) password: 
(1/3) Installing musl-obstack (1.2.3-r2)
(2/3) Installing libucontext (1.3.3-r0)
(3/3) Installing gcompat (1.1.0-r4)
OK: 538 MiB in 126 packages

Results

/usr/local/bin # ./silverbullet-2.3.0-bin /tmp/sbtest01
2025/11/26 14:26:47 SilverBullet will only be available locally, to allow outside connections, pass -L0.0.0.0 as a flag, and put a TLS terminator on top.
2025/11/26 14:26:47 Local shell command execution enabled for ALL commands.
2025/11/26 14:26:47 Index page index.md does not yet exist, creating...
2025/11/26 14:26:47 Config page CONFIG.md does not yet exist, creating...
2025/11/26 14:26:47 SilverBullet is now running: http://localhost:3000

When I ran into this problem, initially v0.x, I hypothesized it may have been due to alpine using musl, but I didn’t know how to test. I will research to better understand how to identify and test in the future. For now I will add libc6-compat to my alpine template.

Again, thank you.

Excellent explanation from the link you provided and the author provides commands and examples on troubleshooting. Awesome.

All going into my SilverBullet space.

1 Like