Cross-Compiled boost для ppc64le не работает ссылка

Я пытаюсь кросс-компилировать библиотеку boost для ppc64le, и мне нужно, чтобы она работала на RH9.

Я делаю кросс-компиляцию внутри контейнера и используюat15.0набор инструментов.

Компиляция работает, но при компиляции моего кода я получаю эту ошибку:

      libboost_system.a(error_code.o): in function `_GLOBAL__sub_I__ZN5boost6system6throwsE':
    error_code.cpp:(.text.startup+0x20): call to `boost::system::generic_category()' lacks nop, can't restore toc; (plt call stub)
    error_code.cpp:(.text.startup+0x24): call to `boost::system::generic_category()' lacks nop, can't restore toc; (plt call stub)
    error_code.cpp:(.text.startup+0x28): call to `boost::system::system_category()' lacks nop, can't restore toc; (plt call stub)
    error_code.cpp:(.text.startup+0x38): call to `boost::system::system_category()' lacks nop, can't restore toc; (plt call stub)
    /opt/at15.0/bin/powerpc64le-linux-gnu-ld: final link failed: bad value

Это раздел dockerfile, который я использую для кросс-компиляции (многоэтапная сборка).

      FROM registry.access.redhat.com/ubi8/ubi:8.1 AS CrossCompileBase

# Install required packages
RUN yum -y update \
    # && yum install epel-release \
    # && yum update -y \
    && yum -y install \
            xz-5.2.4 \
            gcc-8.5.0 \
            gcc-c++-8.5.0 \
            make-4.2.1 \
            wget-1.19.5 \
            tar-1.30 \
            cmake-3.20.2 \
            autoconf-2.69 \
            automake-1.16.1 \
            libtool-2.4.6 \
            pkgconfig \
            bzip2-1.0.6 \
            zlib-devel-1.2.11 \
            rpm-build-4.14.3 \
            diffutils-3.6 \
            sudo \
            curl-7.61.1 \
            python36-3.6.8 \
            python36-devel-3.6.8 \
            python3-pip-9.0.3  \
    && yum -y clean all;

# Download and install the advance-toolchain-at15.0
RUN mkdir -p /tmp/at15  \
    && wget \
        -qO /tmp/at15/advance-toolchain-at15.0-cross-common-15.0-0.x86_64.rpm \
        "https://public.dhe.ibm.com/software/server/POWER/Linux/toolchain/at/redhat/RHEL8/at15.0/advance-toolchain-at15.0-cross-common-15.0-0.x86_64.rpm" \
        --no-check-certificate \
    && wget \
        -qO /tmp/at15/advance-toolchain-at15.0-cross-ppc64le-15.0-0.x86_64.rpm \
        "https://public.dhe.ibm.com/software/server/POWER/Linux/toolchain/at/redhat/RHEL8/at15.0/advance-toolchain-at15.0-cross-ppc64le-15.0-0.x86_64.rpm" \
        --no-check-certificate \
    && yum install -y /tmp/at15//*.rpm \
    && rm -rf /tmp/at15

# Set cross compile environment variables:
ENV CC=/opt/at15.0/bin/powerpc64le-linux-gnu-gcc 
ENV CXX=/opt/at15.0/bin/powerpc64le-linux-gnu-g++ 
ENV CMAKE_C_COMPILER=/opt/at15.0/bin/powerpc64le-linux-gnu-gcc 
ENV CMAKE_CXX_COMPILER=/opt/at15.0/bin/powerpc64le-linux-gnu-g++ 
ENV PATH=$PATH:/opt/at15.0/bin:/opt/cmake/bin/ 


# install boost
FROM CrossCompileBase AS LibBoostBuilder
RUN mkdir -p /tmp/install/boost \
    && wget -qO /tmp/boost_1_64_0.tar.gz "https://boostorg.jfrog.io/artifactory/main/release/1.64.0/source/boost_1_64_0.tar.gz" --no-check-certificate \
    && cd /tmp \
    && tar xvf boost_1_64_0.tar.gz  
ENV CC=/opt/at15.0/bin/powerpc64le-linux-gnu-gcc 
ENV CXX=/opt/at15.0/bin/powerpc64le-linux-gnu-g++ 
COPY user-config.jam /tmp/boost_1_64_0/user-config.jam
RUN cd /tmp/boost_1_64_0 \
    && ./bootstrap.sh \
        --with-toolset=gcc \
        --prefix=/usr/local/boost \
        --without-libraries=python \
    && ./b2 \
        --user-config=/tmp/boost_1_64_0/user-config.jam \
            toolset=gcc \
            target-os=linux \
            link=static \
            variant=release \
        install \
            --with-filesystem \
            --with-system \
            --with-regex

содержимое user-config.jam:

      import toolset ;
using gcc : : /opt/at15.0/bin/powerpc64le-linux-gnu-gcc ;

Попытался посмотреть, что ChatGPT говорит по этому поводу:

Это сообщение об ошибке указывает на проблему с кодом, вызывающим функцию boost::system::generic_category(). В сообщении об ошибке конкретно упоминается отсутствующая инструкция «nop», которая представляет собой специальную инструкцию, которая используется для заполнения инструкций в коде, чтобы они соответствовали определенной границе памяти.

В сообщении об ошибке также упоминается проблема с «toc», что означает «оглавление». TOC — это структура данных, используемая архитектурой PowerPC для управления вызовами функций и доступом к данным. Сообщение об ошибке предполагает, что функция boost::system::generic_category() вызывается с использованием «заглушки вызова plt», которая представляет собой механизм, используемый компоновщиком для включения динамического связывания общих библиотек.

Не уверен, что я делаю неправильно.

0 ответов

Другие вопросы по тегам