google / google/brotli

Unable to compile static Go binary -- undefined reference to `_kBrotli` constants

Open
#1,189 6 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
14.9k
Forks
1.4k
Avg merge
4d 20h
Merged PRs (30d)
9

Description

When attempting to compile a static Go binary with brotli static libs, it fails to find symbols defined in the libbrotlicommon.

Example Alpine Dockerfile:
```dockerfile
FROM golang:1.23-alpine AS alpine
WORKDIR /usr/local/app

RUN apk add gcc musl-dev brotli-dev brotli-static

COPY <
Another Dockerfile example with Debian (in case of any musl weirdness):

```dockerfile
FROM golang:1.23 AS debian
WORKDIR /usr/local/app

RUN apt-get update && apt-get upgrade -y && apt-get install -y libbrotli-dev libbrotli1

COPY <

Has the following error:
```bash
=> ERROR [alpine 6/6] RUN go build -ldflags "-extldflags='-static'" 11.2s
------
> [alpine 6/6] RUN go build -ldflags "-extldflags='-static'":
11.11 # brotli_example
11.11 /usr/local/go/pkg/tool/linux_arm64/link: running gcc failed: exit status 1
11.11 /usr/bin/gcc -o $WORK/b001/exe/a.out -Wl,--export-dynamic-symbol=_cgo_panic -Wl,--export-dynamic-symbol=_cgo_topofstack -Wl,--export-dynamic-symbol=crosscall2 -Wl,--compress-debug-sections=zlib /tmp/go-link-3277924513/go.o /tmp/go-link-3277924513/00
0000.o /tmp/go-link-3277924513/000001.o /tmp/go-link-3277924513/000002.o /tmp/go-link-3277924513/000003.o /tmp/go-link-3277924513/000004.o /tmp/go-link-3277924513/000005.o /tmp/go-link-3277924513/000006.o /tmp/go-link-3277924513/000007.o /tmp/go-link-3277
924513/000008.o /tmp/go-link-3277924513/000009.o /tmp/go-link-3277924513/000010.o /tmp/go-link-3277924513/000011.o /tmp/go-link-3277924513/000012.o /tmp/go-link-3277924513/000013.o /tmp/go-link-3277924513/000014.o /tmp/go-link-3277924513/000015.o /tmp/go-
link-3277924513/000016.o /tmp/go-link-3277924513/000017.o -O2 -g -lbrotlicommon -lbrotlidec -lbrotlienc -O2 -g -lpthread -no-pie -static
11.11 lto-wrapper: warning: using serial compilation of 8 LTRANS jobs
11.11 lto-wrapper: note: see the '-flto' option documentation for more information
11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /tmp/ccBecAec.ltrans0.ltrans.o: in function `SafeDecodeLiteralBlockSwitch':
11.11 /home/buildozer/aports/main/brotli/src/brotli-1.1.0/c/dec/decode.c:904:(.text+0x9ac): undefined reference to `_kBrotliPrefixCodeRanges'
11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /tmp/ccBecAec.ltrans0.ltrans.o:/home/buildozer/aports/main/brotli/src/brotli-1.1.0/c/dec/decode.c:904:(.text+0x9b0): undefined reference to `_kBrotliPrefixCo
deRanges'
11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /tmp/ccBecAec.ltrans0.ltrans.o: in function `SafeDecodeLiteralBlockSwitch':
11.11 /home/buildozer/aports/main/brotli/src/brotli-1.1.0/c/dec/decode.c:1200:(.text+0xbc4): undefined reference to `_kBrotliContextLookupTable'
11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /tmp/ccBecAec.ltrans0.ltrans.o:/home/buildozer/aports/main/brotli/src/brotli-1.1.0/c/dec/decode.c:1200:(.text+0xbc8): undefined reference to `_kBrotliContext
LookupTable'
...
```
The static libs (.a suffix) appear to be present in the Alpine build:
```sh
/usr/local/app # ls /usr/lib? | grep libbrotli
libbrotlicommon.a
libbrotlicommon.so
libbrotlicommon.so.1
libbrotlicommon.so.1.1.0
libbrotlidec.a
libbrotlidec.so
libbrotlidec.so.1
libbrotlidec.so.1.1.0
libbrotlienc.a
libbrotlienc.so
libbrotlienc.so.1
libbrotlienc.so.1.1.0
```

The same error happens with the Debian Dockerfile, so I'm at a loss as to why the linker or gcc can't find `_k` defined constants in brotlicommon when using `-static`.

I was able to compile a dynamic executable successfully with the normal `go build`.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.