Hello dear Hackers I'm trying to upgrade to v17 and encountering a strange issue.
I've made a minimal reproduction that works with 16.4 but fails with 17.0, it also works without the "-static" compile flag: # syntax=docker/dockerfile:1 > FROM alpine:3.20 AS builder > > # Fails with 17.0 succeeds with 16.4 > ARG PG=17.0 > > USER root > RUN apk update && apk add --no-cache --update-cache \ > ca-certificates-bundle \ > util-linux-dev \ > clang17-dev \ > execline-dev \ > llvm18-dev \ > libedit-dev \ > libxml2-dev \ > build-base \ > net-tools \ > clang17 \ > zlib-dev \ > autoconf \ > automake \ > busybox \ > llvm18 \ > icu-dev \ > cmake \ > bison \ > flex \ > perl \ > curl \ > bash \ > flex > WORKDIR /app > > RUN curl -L > https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz > > openssl.tar.gz > RUN mkdir openssl && tar --extract --file=openssl.tar.gz --strip-components=1 > --directory=openssl && rm openssl.tar.gz > RUN cd openssl && CC=clang CXX=clang++ perl ./Configure \ > linux-$(uname -m) \ > --prefix=/usr \ > --libdir=lib \ > --openssldir=/etc/ssl \ > enable-ktls \ > shared \ > no-zlib \ > no-async \ > no-comp \ > no-idea \ > no-mdc2 \ > no-rc5 \ > no-ec2m \ > no-sm2 \ > no-sm4 \ > no-ssl3 \ > no-seed \ > no-weak-ssl-ciphers \ > -Wa,--noexecstack && \ > perl configdata.pm --dump && \ > make -j$(nproc) && make install > > RUN curl -L https://ftp.postgresql.org/pub/source/v$PG/postgresql-$PG.tar.bz2 > > postgresql.tar.bz2 > RUN mkdir postgresql && tar --extract --bzip2 --file=postgresql.tar.bz2 > --strip-components=1 --directory=postgresql && rm postgresql.tar.bz2 > RUN cd postgresql && CC=clang CXX=clang++ ./configure --with-openssl > --with-libedit-preferred --with-uuid=e2fs --with-libxml --prefix=/usr/local > RUN cd postgresql/src/include && CC=clang CXX=clang++ make && make install > RUN cd postgresql/src/common && CC=clang CXX=clang++ make && make install > RUN cd postgresql/src/port && CC=clang CXX=clang++ make && make install > RUN cd postgresql/src/interfaces/libpq && CC=clang CXX=clang++ make && make > install > > COPY <<EOF ./main.cpp > #include <algorithm> > #include <iostream> > #include <chrono> > #include <thread> > #include <cstring> > #include <csignal> > #include <vector> > > #include <libpq-fe.h> > > void sig_handler(int /*_signo*/, siginfo_t * info, void * /*_ctx*/) { > raise(info->si_signo); > _exit(EXIT_FAILURE); > } > > void registerSignalHandlers() { > std::vector<int> signals = { > // Signals for which the default action is "Core". > SIGABRT, // Abort signal from abort(3) > SIGBUS, // Bus error (bad memory access) > SIGFPE, // Floating point exception > SIGILL, // Illegal Instruction > SIGIOT, // IOT trap. A synonym for SIGABRT > SIGQUIT, // Quit from keyboard > SIGSEGV, // Invalid memory reference > SIGSYS, // Bad argument to routine (SVr4) > SIGTRAP, // Trace/breakpoint trap > SIGXCPU, // CPU time limit exceeded (4.2BSD) > SIGXFSZ, // File size limit exceeded (4.2BSD) > SIGTERM > }; > > for (size_t i = 0; i < signals.size(); ++i) { > struct sigaction action; > memset(&action, 0, sizeof action); > action.sa_flags = static_cast<int>(SA_SIGINFO | SA_ONSTACK | SA_NODEFER | > SA_RESETHAND); > sigfillset(&action.sa_mask); > sigdelset(&action.sa_mask, signals[i]); > action.sa_sigaction = &sig_handler; > sigaction(signals[i], &action, nullptr); > } > } > > int main() { > registerSignalHandlers(); > std::cout << "start" << std::endl; > PGconn *conn = PQconnectdb(""); > if (conn == NULL) { > std::cout << "fail" << std::endl; > } else { > if (PQstatus(conn) == CONNECTION_OK) { > std::cout << "success" << std::endl; > } else { > fprintf(stderr, "fail: %s", PQerrorMessage(conn)); > } > PQfinish(conn); > } > while (true) { > std::this_thread::sleep_for(std::chrono::milliseconds(1000)); > } > return 0; > } > EOF > > # Fails with "-static" succeeds without > RUN CC=clang CXX=clang++ clang++ \ > -std=c++20 \ > -static \ > -flto \ > -O3 \ > -march=native \ > -Wpedantic \ > -Wall \ > -Wextra \ > -Wsign-conversion \ > -Wconversion \ > -o main main.cpp \ > -lpq \ > -lpgcommon \ > -lpgport \ > -lssl \ > -lcrypto \ > -lpthread \ > -ldl > ENTRYPOINT ["./main"] > CMD [] > > And here is the output: 15/15 RUN CC=clang CXX=clang++ clang++ -std=c++20 -static -flto -O3 -march=native -Wpedantic -Wall -Wextra -Wsign-conversion -Wconversion -o main main.cpp -lpq -lpgcommon -lpgport -lssl -lcrypto -lpthread -ldl ERROR 1.0s 1 /usr/bin/ld: /usr/local/lib/libpq.a(fe-connect.o): in function `pqConnectOptions2': 2 fe-connect.c:(.text+0x1cb4): undefined reference to `pg_encoding_to_char' 3 /usr/bin/ld: /usr/local/lib/libpq.a(fe-connect.o): in function `PQsetClientEncoding': 4 fe-connect.c:(.text+0x64a8): undefined reference to `pg_encoding_to_char' 5 /usr/bin/ld: /usr/local/lib/libpq.a(fe-exec.o): in function `pqSaveParameterStatus': 6 fe-exec.c:(.text+0x1168): undefined reference to `pg_char_to_encoding' 7 /usr/bin/ld: /usr/local/lib/libpq.a(fe-misc.o): in function `PQenv2encoding': 8 fe-misc.c:(.text+0x1394): undefined reference to `pg_char_to_encoding' 9 clang++: error: linker command failed with exit code 1 (use -v to see invocation) Any ideas? Best regard Mikael Sand
Dockerfile
Description: Binary data