confluentinc / confluent-kafka-go

Confluent's Apache Kafka Golang client
Apache License 2.0
4.63k stars 658 forks source link

Can't statically build binary with vendored library on arm64 musl #1155

Closed maxime-roo closed 6 months ago

maxime-roo commented 7 months ago

Description

Building a statically linked binary with the vendored library doesn't work consistently for arm64 across versions of the library.

I followed the steps in Static builds on Linux.

I understand that with the vendored library, I should be able to build a static binary:

Static compilation command, meant to be used alongside the prebuilt librdkafka bundle:

CC=/path/to/musl-gcc go build --ldflags '-linkmode external -extldflags "-static"' -tags musl

Note that the issue is for arm64, following the steps in the readme for amd64 with the vendored library works. Building https://github.com/confluentinc/librdkafka from source can work too for both arm64 and amd64. I haven't tested with other architectures as only amd64 and arm64 vendored libraries are provided.

How to reproduce

Dockerfile

```dockerfile
FROM --platform=linux/$TARGETARCH golang:1.22.1-alpine as build
ARG LIB_VERSION
RUN apk --no-cache add git gcc musl-dev
RUN go mod init test-app && go get github.com/confluentinc/confluent-kafka-go/v2@$LIB_VERSION
RUN echo $'package main\nimport "github.com/confluentinc/confluent-kafka-go/v2/kafka"\nfunc main() { kafka.NewProducer(&kafka.ConfigMap{}) }' > main.go
RUN go build -o cmd -tags musl --ldflags '-linkmode external -extldflags "-static -s"' .
FROM --platform=linux/$TARGETARCH gcr.io/distroless/static-debian12 as release
COPY --from=build /go/cmd /cmd
CMD ["/cmd"]
```

Succeeds

# amd64
docker build --build-arg="TARGETARCH=amd64" --build-arg="LIB_VERSION=v2.1.0" .
docker build --build-arg="TARGETARCH=amd64" --build-arg="LIB_VERSION=v2.1.1" .
docker build --build-arg="TARGETARCH=amd64" --build-arg="LIB_VERSION=v2.2.0" .
docker build --build-arg="TARGETARCH=amd64" --build-arg="LIB_VERSION=v2.3.0" .
# arm64
docker build --build-arg="TARGETARCH=arm64" --build-arg="LIB_VERSION=v2.1.1" .
docker build --build-arg="TARGETARCH=arm64" --build-arg="LIB_VERSION=v2.2.0" .

Fails

docker build --build-arg="TARGETARCH=arm64" --build-arg="LIB_VERSION=v2.1.0" .
docker build --build-arg="TARGETARCH=arm64" --build-arg="LIB_VERSION=v2.3.0" .
output for arm64 and library version 2.3.0

```bash
docker build --build-arg="TARGETARCH=arm64" --build-arg="LIB_VERSION=v2.3.0" .
```

```log
#10 [build 5/5] RUN go build -o cmd -tags musl --ldflags '-linkmode external -extldflags "-static -s"' .
#10 0.098 go: warning: ignoring go.mod in $GOPATH /go
#10 11.04 # test-app
#10 11.04 /usr/local/go/pkg/tool/linux_arm64/link: running gcc failed: exit status 1
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /go/pkg/mod/github.com/confluentinc/confluent-kafka-go/v2@v2.3.0/kafka/librdkafka_vendor/librdkafka_musl_linux_arm64.a(rdkafka_sasl_cyrus.o): in function `rd_kafka_sasl_cyrus_close':
#10 11.04 (.text+0xb4): undefined reference to `sasl_dispose'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /go/pkg/mod/github.com/confluentinc/confluent-kafka-go/v2@v2.3.0/kafka/librdkafka_vendor/librdkafka_musl_linux_arm64.a(rdkafka_sasl_cyrus.o): in function `rd_kafka_sasl_cyrus_recv':
#10 11.04 (.text+0x198): undefined reference to `sasl_client_step'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0x1c0): undefined reference to `sasl_errdetail'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0x354): undefined reference to `sasl_getprop'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0x384): undefined reference to `sasl_getprop'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0x3a4): undefined reference to `sasl_getprop'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /go/pkg/mod/github.com/confluentinc/confluent-kafka-go/v2@v2.3.0/kafka/librdkafka_vendor/librdkafka_musl_linux_arm64.a(rdkafka_sasl_cyrus.o): in function `rd_kafka_sasl_cyrus_client_new':
#10 11.04 (.text+0xf64): undefined reference to `sasl_client_new'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0xfc4): undefined reference to `sasl_client_start'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0xfe4): undefined reference to `sasl_errdetail'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0x10fc): undefined reference to `sasl_listmech'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0x1170): undefined reference to `sasl_errstring'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /go/pkg/mod/github.com/confluentinc/confluent-kafka-go/v2@v2.3.0/kafka/librdkafka_vendor/librdkafka_musl_linux_arm64.a(rdkafka_sasl_cyrus.o): in function `rd_kafka_sasl_cyrus_global_init':
#10 11.04 (.text+0x16cc): undefined reference to `sasl_client_init'
#10 11.04 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: (.text+0x16fc): undefined reference to `sasl_errstring'
#10 11.04 collect2: error: ld returned 1 exit status
#10 11.04 
#10 ERROR: process "/bin/sh -c go build -o cmd -tags musl --ldflags '-linkmode external -extldflags \"-static -s\"' ." did not complete successfully: exit code: 1
```

Adding cyrus-sasl

Adding cyrus-sasl-static doesn't fix the linker issue either.

Dockerfile

```Dockerfile
FROM --platform=linux/$TARGETARCH golang:1.22.1-alpine as build
RUN apk --no-cache add git gcc musl-dev
RUN apk --no-cache add cyrus-sasl-static cyrus-sasl-dev
ARG LIB_VERSION
RUN go mod init test-app && go get github.com/confluentinc/confluent-kafka-go/v2@$LIB_VERSION
RUN echo $'package main\nimport "github.com/confluentinc/confluent-kafka-go/v2/kafka"\nfunc main() { kafka.NewProducer(&kafka.ConfigMap{}) }' > main.go
RUN CGO_LDFLAGS="-lsasl2" go build -o cmd -tags musl --ldflags '-linkmode external -extldflags "-static -s"' .
FROM --platform=linux/$TARGETARCH gcr.io/distroless/static-debian12 as release
COPY --from=build /go/cmd /cmd
CMD ["/cmd"]
```

Output

```bash
docker build --build-arg="TARGETARCH=arm64" --build-arg="LIB_VERSION=v2.3.0" .
```

```log
#11 [build 6/6] RUN CGO_LDFLAGS="-lsasl2" go build -o cmd -tags musl --ldflags '-linkmode external -extldflags "-static -s"' .
#11 0.097 go: warning: ignoring go.mod in $GOPATH /go
#11 11.11 # test-app
#11 11.11 /usr/local/go/pkg/tool/linux_arm64/link: running gcc failed: exit status 1
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(db_gdbm.o): in function `_sasldb_getdata':
#11 11.11 db_gdbm.c:(.text+0x178): undefined reference to `gdbm_open'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x188): undefined reference to `gdbm_errno_location'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x1c8): undefined reference to `gdbm_fetch'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x1d4): undefined reference to `gdbm_errno_location'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x1e8): undefined reference to `gdbm_close'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x230): undefined reference to `gdbm_errno_location'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(db_gdbm.o): in function `_sasldb_putdata':
#11 11.11 db_gdbm.c:(.text+0x424): undefined reference to `gdbm_open'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x44c): undefined reference to `gdbm_errno_location'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x4b8): undefined reference to `gdbm_store'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x4c8): undefined reference to `gdbm_errno_location'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x4f0): undefined reference to `gdbm_close'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x500): undefined reference to `gdbm_delete'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x510): undefined reference to `gdbm_errno_location'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(db_gdbm.o): in function `_sasldb_getkeyhandle':
#11 11.11 db_gdbm.c:(.text+0x794): undefined reference to `gdbm_open'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x7a4): undefined reference to `gdbm_errno_location'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x7f4): undefined reference to `gdbm_close'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(db_gdbm.o): in function `_sasldb_getnextkey':
#11 11.11 db_gdbm.c:(.text+0x860): undefined reference to `gdbm_firstkey'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: db_gdbm.c:(.text+0x8a0): undefined reference to `gdbm_nextkey'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(db_gdbm.o): in function `_sasldb_releasekeyhandle':
#11 11.11 db_gdbm.c:(.text+0x92c): undefined reference to `gdbm_close'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(digestmd5.o): in function `dec_des':
#11 11.11 digestmd5.c:(.text+0xd14): undefined reference to `DES_cbc_encrypt'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(digestmd5.o): in function `enc_des':
#11 11.11 digestmd5.c:(.text+0xe88): undefined reference to `DES_cbc_encrypt'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `gssapi_wrap_sizes.isra.0':
#11 11.11 gssapi.c:(.text+0x1e4): undefined reference to `gss_wrap_size_limit'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `sasl_gss_free_context_contents.isra.0':
#11 11.11 gssapi.c:(.text+0x27c): undefined reference to `gss_delete_sec_context'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x294): undefined reference to `gss_release_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x2ac): undefined reference to `gss_release_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x2c4): undefined reference to `gss_release_cred'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x2dc): undefined reference to `gss_release_cred'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `sasl_gss_seterror_.isra.0':
#11 11.11 gssapi.c:(.text+0x4b0): undefined reference to `gss_display_status'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x550): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x5a8): undefined reference to `gss_display_status'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x610): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `gssapi_get_ssf':
#11 11.11 gssapi.c:(.text+0x6e8): undefined reference to `gss_inquire_sec_context_by_oid'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x72c): undefined reference to `gss_release_buffer_set'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x790): undefined reference to `gss_release_buffer_set'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `gssapi_client_mech_step':
#11 11.11 gssapi.c:(.text+0xad0): undefined reference to `__gss_c_nt_hostbased_service_oid_desc'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xad4): undefined reference to `__gss_c_nt_hostbased_service_oid_desc'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xae4): undefined reference to `gss_import_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xba8): undefined reference to `gss_init_sec_context'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xbe0): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xbfc): undefined reference to `gss_delete_sec_context'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xc9c): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xcf4): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xd24): undefined reference to `gss_inquire_context'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xd58): undefined reference to `gss_display_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xd74): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xdec): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xe98): undefined reference to `gss_unwrap'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0xfbc): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1098): undefined reference to `gss_wrap'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1274): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `gssapi_server_mech_step':
#11 11.11 gssapi.c:(.text+0x14a0): undefined reference to `__gss_c_nt_hostbased_service_oid_desc'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x14a4): undefined reference to `__gss_c_nt_hostbased_service_oid_desc'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x14b4): undefined reference to `gss_import_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1504): undefined reference to `gss_release_cred'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1530): undefined reference to `gss_acquire_cred'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1594): undefined reference to `gss_accept_sec_context'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x15e8): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1628): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x16a4): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x174c): undefined reference to `gss_canonicalize_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x179c): undefined reference to `gss_display_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x17e0): undefined reference to `gss_release_cred'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x17f8): undefined reference to `gss_release_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x180c): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1834): undefined reference to `gss_release_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x18d8): undefined reference to `gss_import_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1904): undefined reference to `gss_compare_name'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1988): undefined reference to `gss_release_cred'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1b34): undefined reference to `gss_wrap'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1b68): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1b9c): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1bd8): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1c28): undefined reference to `gss_unwrap'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1cfc): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1de8): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `gssapi_decode_packet':
#11 11.11 gssapi.c:(.text+0x1f38): undefined reference to `gss_unwrap'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1f6c): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x1fc4): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x2010): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `sasl_gss_encode':
#11 11.11 gssapi.c:(.text+0x20d4): undefined reference to `gss_wrap'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x2108): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x2158): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: gssapi.c:(.text+0x221c): undefined reference to `gss_release_buffer'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(gssapi.o): in function `gssapiv2_server_plug_init':
#11 11.11 gssapi.c:(.text+0x2368): undefined reference to `gsskrb5_register_acceptor_identity'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(ntlm.o): in function `P16_nt':
#11 11.11 ntlm.c:(.text+0x47c): undefined reference to `MD4'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(sql.o): in function `_sqlite3_close':
#11 11.11 sql.c:(.text+0x1140): undefined reference to `sqlite3_close'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(sql.o): in function `_sqlite3_exec':
#11 11.11 sql.c:(.text+0x1190): undefined reference to `sqlite3_exec'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: sql.c:(.text+0x11c0): undefined reference to `sqlite3_free'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../lib/libsasl2.a(sql.o): in function `_sqlite3_open':
#11 11.11 sql.c:(.text+0x12f4): undefined reference to `sqlite3_open'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: sql.c:(.text+0x1310): undefined reference to `sqlite3_errmsg'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: sql.c:(.text+0x1330): undefined reference to `sqlite3_close'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: sql.c:(.text+0x1388): undefined reference to `sqlite3_exec'
#11 11.11 /usr/lib/gcc/aarch64-alpine-linux-musl/13.2.1/../../../../aarch64-alpine-linux-musl/bin/ld: sql.c:(.text+0x13bc): undefined reference to `sqlite3_free'
#11 11.11 collect2: error: ld returned 1 exit status
#11 11.11 
#11 ERROR: process "/bin/sh -c CGO_LDFLAGS=\"-lsasl2\" go build -o cmd -tags musl --ldflags '-linkmode external -extldflags \"-static -s\"' ." did not complete successfully: exit code: 1
```

Manualy building the library

It is possible to build a static binary when following the steps of #471

Dockerfile

```Dockerfile
FROM --platform=linux/$TARGETARCH golang:1.22.1-alpine3.19 as build
RUN apk --no-cache add git gcc musl-dev
ARG LIB_VERSION
RUN go mod init test-app && go get github.com/confluentinc/confluent-kafka-go/v2@$LIB_VERSION
RUN apk add --no-cache \
      bash \
      build-base \
      coreutils \
      gcc \
      git \
      make \
      musl-dev \
      openssl-dev \
      openssl-libs-static \
      rpm \
      lz4-dev \
      lz4-static \
      zlib-dev \
      zlib-static \
      zstd-dev \
      zstd-static \
      wget && \
    # download libsasl to a temp location and build
    # enable/disable features as needed with configure
    cd $(mktemp -d) && \
    wget -nv -O cyrus-sasl-2.1.28.tar.gz https://github.com/cyrusimap/cyrus-sasl/releases/download/cyrus-sasl-2.1.28/cyrus-sasl-2.1.28.tar.gz && \
    tar -xz --strip-components=1 -f cyrus-sasl-2.1.28.tar.gz && \
    rm -f cyrus-sasl-2.1.28.tar.gz && \
    ./configure --prefix=/usr --disable-sample --disable-obsolete_cram_attr --disable-obsolete_digest_attr --enable-static --disable-shared \
        --disable-checkapop --disable-cram --disable-digest --enable-scram --disable-otp --disable-gssapi --with-dblib=none --with-pic && \
    make -j && \
    make install && \
    cd $(mktemp -d) && \
    wget -nv -O v2.3.0.tar.gz https://github.com/confluentinc/librdkafka/archive/v2.3.0.tar.gz && \
    tar -xz --strip-components=1 -f v2.3.0.tar.gz && \
    rm -f v2.3.0.tar.gz && \
    ./configure --prefix=/usr \
        --enable-zlib \
        --enable-zstd \
        --enable-ssl \
        --enable-gssapi \
        --enable-sasl \
        --enable-lz4-ext && \
    make -j && \
    make install

RUN echo $'package main\nimport "github.com/confluentinc/confluent-kafka-go/v2/kafka"\nfunc main() { kafka.NewProducer(&kafka.ConfigMap{}) }' > main.go

RUN CGO_LDFLAGS="-lsasl2" go build -o cmd -tags musl --ldflags '-linkmode external -extldflags "-static -s"' .
FROM --platform=linux/$TARGETARCH gcr.io/distroless/static-debian12 as release
COPY --from=build /go/cmd /cmd
CMD ["/cmd"]
```

Building librdkafka is not strictly necessary, building cyrus-sasl is:

Dockerfile

```Dockerfile
FROM --platform=linux/$TARGETARCH golang:1.22.1-alpine3.19 as build
RUN apk --no-cache add git gcc musl-dev
ARG LIB_VERSION
RUN go mod init test-app && go get github.com/confluentinc/confluent-kafka-go/v2@$LIB_VERSION
RUN apk add --no-cache \
      bash \
      build-base \
      coreutils \
      gcc \
      git \
      make \
      musl-dev \
      openssl-dev \
      openssl-libs-static \
      rpm \
      lz4-dev \
      lz4-static \
      zlib-dev \
      zlib-static \
      zstd-dev \
      zstd-static \
      wget && \
    # download libsasl to a temp location and build
    # enable/disable features as needed with configure
    cd $(mktemp -d) && \
    wget -nv -O cyrus-sasl-2.1.28.tar.gz https://github.com/cyrusimap/cyrus-sasl/releases/download/cyrus-sasl-2.1.28/cyrus-sasl-2.1.28.tar.gz && \
    tar -xz --strip-components=1 -f cyrus-sasl-2.1.28.tar.gz && \
    rm -f cyrus-sasl-2.1.28.tar.gz && \
    ./configure --prefix=/usr --disable-sample --disable-obsolete_cram_attr --disable-obsolete_digest_attr --enable-static --disable-shared \
        --disable-checkapop --disable-cram --disable-digest --enable-scram --disable-otp --enable-gssapi --with-dblib=none --with-pic && \
    make -j && \
    make install

RUN echo $'package main\nimport "github.com/confluentinc/confluent-kafka-go/v2/kafka"\nfunc main() { kafka.NewProducer(&kafka.ConfigMap{}) }' > main.go

RUN CGO_LDFLAGS="-lsasl2" go build -o cmd -tags musl --ldflags '-linkmode external -extldflags "-static -s"' .
FROM --platform=linux/$TARGETARCH gcr.io/distroless/static-debian12 as release
COPY --from=build /go/cmd /cmd
CMD ["/cmd"]
```

Checklist

Please provide the following information:

milindl commented 6 months ago

This is a known issue, we're working on a fix. Thanks for the report!

The script that imports librdkafka static bundle into this repository has a bug, and is inconsistent across versions with regards to whether cyrus-sasl stuff is included or not. We plan to fix this in the next release while importing librdkafka, we're changing the script to always exclude it. More details here, https://github.com/confluentinc/confluent-kafka-go/issues/981.

maxime-roo commented 6 months ago

I missed that issue, thanks!