Почему компиляция с помощью musl на Alpine не удалась, а на ArchLinux удалась - PullRequest
0 голосов
/ 16 февраля 2019

Это вопрос из любопытства: почему?

Почему он ведет себя по-разному для одного и того же кода?

Я частоесть проблема, что я могу скомпилировать что-то в одном дистрибутиве, но не в другом.Итак, сегодня я снова столкнулся с одной из тех проблем, когда при такой же сборке pg_dump PostgreSQL с ArchLinux он работает, но когда я делаю это на Alpine, он выходит из строя с этой ошибкой:

gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -static -fPIC -D_REENTRANT -D_THREAD_SAFE -D_POSIX_PTHREAD_SEMANTICS -fPIC -shared -Wl,-soname,libpq.so.5 -Wl,--version-script=exports.list -o libpq.so.5.11 fe-auth.o fe-auth-scram.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-lobj.o fe-protocol2.o fe-protocol3.o pqexpbuffer.o fe-secure.o libpq-events.o chklocale.o inet_net_ntop.o noblock.o pgstrcasecmp.o pqsignal.o thread.o getpeereid.o pg_strong_random.o encnames.o wchar.o base64.o ip.o md5.o scram-common.o saslprep.o unicode_norm.o sha2.o -L../../../src/port -L../../../src/common    -Wl,--as-needed -Wl,-rpath,'/usr/local/pgsql/lib',--enable-new-dtags    
/lib/gcc/x86_64-linux-musl/8.2.0/../../../../x86_64-linux-musl/bin/ld: /lib/gcc/x86_64-linux-musl/8.2.0/crtbeginT.o: relocation R_X86_64_32 against hidden symbol `__TMC_END__' can not be used when making a shared object
/lib/gcc/x86_64-linux-musl/8.2.0/../../../../x86_64-linux-musl/bin/ld: /lib/gcc/x86_64-linux-musl/8.2.0/crtend.o: relocation R_X86_64_32 against `.ctors' can not be used when making a shared object; recompile with -fPIC
/lib/gcc/x86_64-linux-musl/8.2.0/../../../../x86_64-linux-musl/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
make[1]: Leaving directory '/src/src/interfaces/libpq'
make[1]: *** [../../../src/Makefile.shlib:309: libpq.so.5.11] Error 1
make: *** [../../../src/Makefile.global:580: submake-libpq] Error 2

ВотDockerfile для Alpine:

FROM muslcc/x86_64:x86_64-linux-musl

RUN apk update && apk add make

ENV DOWNLOAD_URL https://ftp.postgresql.org/pub/source/v11.2/postgresql-11.2.tar.bz2

WORKDIR /src
RUN wget "$DOWNLOAD_URL" && \
    tar xvjf "${DOWNLOAD_URL##*/}" --strip-components=1 && \
    rm -fv "${DOWNLOAD_URL##*/}"

# NOTE: I left the -fPIC here for clarity sake but it fails with
#       the same error with or without it
RUN ./configure --without-readline --without-zlib CFLAGS="-static -fPIC"
RUN cd src/bin/pg_dump && make pg_dump

Вот Dockerfile для ArchLinux:

FROM archlinux/base

RUN pacman -Syu --noconfirm --needed base-devel musl

ENV DOWNLOAD_URL https://ftp.postgresql.org/pub/source/v11.2/postgresql-11.2.tar.bz2

WORKDIR /src
RUN curl -o "${DOWNLOAD_URL##*/}" "$DOWNLOAD_URL" && \
    tar xvjf "${DOWNLOAD_URL##*/}" --strip-components=1 && \
    rm -fv "${DOWNLOAD_URL##*/}"

RUN ./configure --without-readline --without-zlib CC="musl-gcc" CFLAGS="-static"
RUN cd src/bin/pg_dump && make pg_dump

Я даже не знаю, где искать.Может ли быть разница версии Мусла?Еще один инструмент компиляции?Я действительно не хочу решения, я хочу понять, почему.

1 Ответ

0 голосов
/ 15 апреля 2019

У меня нет особого опыта работы с Alpine Linux, и мне нужно было бы поиграть с ним самостоятельно, но кажется, что некоторые довольно простые стандартные библиотеки C созданы как неплатформенный код (PIC), что означает, что выЯ не могу связывать динамическую библиотеку с ней.

Я бы начал преследовать разработчиков Alpine Linux по этому поводу, потому что, вероятно, есть флаги конфигурации для PostgreSQL, которые позволят вам создать то, что вы хотите.

Теперь я заметил одну вещь.Вы передаете CFLAGS=-static компиляции, но это бессмысленно, поскольку ./configure уже настроил его как общий - внимательно посмотрите на вызов компилятора, который вы цитируете.Если вы хотите статическую сборку, вам нужно найти правильный флаг конфигурации и использовать его с ./configure. В вашем случае --disable-shared должно работать.

CFLAGS="-static" CXXFLAGS="-static" LDFLAGS="-Wl,-Bstatic" ./configure --without-readline --without-zlib

, кажется, позволяет -static не выходя -shared.

...