openssl/openssl

The "constructor" function attribute caused relocation overflow on ppc64le

Open

#31,242 建立於 2026年5月19日

在 GitHub 查看
 (3 留言) (0 反應) (0 負責人)C (30,157 star) (11,262 fork)batch import
help wantedtriaged: bug

描述

Problem Description

While trying to statically link libcrypto.a into a large PowerPC 64-bit application, we are getting relocation overflow errors:

$ gcc reproducer.o openssl-3.5.1/lib64/libcrypto.a -o test -ldl -pthread -lz
/tmp/ccdTi9n5.ltrans1.ltrans.o: in function `OPENSSL_cpuid_setup':
<artificial>:(.text.startup+0x350): relocation truncated to fit: R_PPC64_REL24 against symbol `OPENSSL_rdtsc_mftb' defined in .text section in /home/dante/openssl-3.5.1/lib64/libcrypto.a(libcrypto-lib-ppccpuid.o)
<artificial>:(.text.startup+0x388): relocation truncated to fit: R_PPC64_REL24 against symbol `OPENSSL_rdtsc_mfspr268' defined in .text section in /home/dante/openssl-3.5.1/lib64/libcrypto.a(libcrypto-lib-ppccpuid.o)
collect2: error: ld returned 1 exit status

OS Name, Version, Hardware platform

Red Hat Enterprise Linux 8.4 (Ootpa)
Platform: ppc64le

How to reproduce

reproducer.c:

#include <openssl/crypto.h>
#include <openssl/evp.h>

__asm__(
  ".pushsection .text,\"ax\",@progbits\n"
  ".balign 16\n"
  "text_gap_begin:\n"
  ".space 0x02000000, 0\n"
  "text_gap_end:\n"
  ".popsection\n"
);

void OPENSSL_cpuid_setup(void) __attribute__((longcall));

int main() {
  return EVP_MD_get_size(EVP_sha256()) == 32 ? 0 : 1;
}

Commands:

gcc -c reproducer.c -o reproducer.o
gcc reproducer.o openssl-3.5.1/lib64/libcrypto.a -o test -ldl -pthread -lz

How we fixed it

diff --git a/crypto/ppccap.c b/crypto/ppccap.c
index 08794a3ba6..b8ecd68793 100644
--- a/crypto/ppccap.c
+++ b/crypto/ppccap.c
@@ -137,6 +137,7 @@ static unsigned long getauxval(unsigned long key)
 
 # if defined(__GNUC__) && __GNUC__>=2
 __attribute__ ((constructor))
+__attribute__((section(".text")))
 # endif
 void OPENSSL_cpuid_setup(void)
 {

OpenSSL version:

OpenSSL 3.5.1 1 Jul 2025 (Library: OpenSSL 3.5.1 1 Jul 2025)
built on: Tue May 19 12:50:07 2026 UTC
platform: linux-ppc64le
options:  bn(64,64)
compiler: /grid/common/pkgs/gcc/v12.4.0p2/bin/gcc  -fPIC -pthread -m64 -Wa,--noexecstack -std=gnu18  -isystem/grid/common/pkgs/zlib-ng/v2.2.3/include -O3 -fPIC -fno-strict-aliasing -Wall -Wl,--allow-multiple-definition -mcmodel=large -mlongcall -Wl,--no-tls-get-addr-optimize -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DZLIB -DNDEBUG -DREDHAT_FIPS_VERSION=140-3
OPENSSLDIR: "/home/dante/src/cdnsOpenssl/install/ssl"
ENGINESDIR: "/home/dante/src/cdnsOpenssl/install/lib64/engines-3"
MODULESDIR: "/home/dante/src/cdnsOpenssl/install/lib64/ossl-modules"
Seeding source: os-specific
CPUINFO: N/A

Configuration data: output of perl configdata.pm --dump

Command line (with current working directory = .):

    /grid/common/pkgsData/perl-v5.38.2/Linux/RHEL8.0-2019-ppc64le/bin/perl ../openssl-3.5.1/Configure --prefix=/home/dante/src/cdnsOpenssl/install shared zlib enable-camellia enable-seed enable-rfc3779 enable-sctp enable-cms enable-md2 enable-rc5 enable-ktls enable-fips no-mdc2 no-ec2m no-sm2 no-sm4 -DREDHAT_FIPS_VERSION=140-3 --libdir=/home/dante/src/cdnsOpenssl/install/lib64 linux-ppc64le

Perl information:

    /grid/common/pkgsData/perl-v5.38.2/Linux/RHEL8.0-2019-ppc64le/bin/perl
    5.38.2 for ppc64le-linux-thread-multi

Enabled features:

    acvp-tests
    afalgeng
    apps
    argon2
    aria
    asm
    async
    atexit
    autoalginit
    autoerrinit
    autoload-config
    bf
    blake2
    bulk
    cached-fetch
    camellia
    capieng
    cast
    chacha
    cmac
    cmp
    cms
    comp
    ct
    default-thread-pool
    deprecated
    des
    dgram
    dh
    docs
    dsa
    dso
    dtls
    dynamic-engine
    ec
    ecdh
    ecdsa
    ecx
    engine
    err
    filenames
    fips
    fips-securitychecks
    fips-post
    gost
    http
    idea
    integrity-only-ciphers
    ktls
    legacy
    loadereng
    makedepend
    md2
    md4
    ml-dsa
    ml-kem
    module
    multiblock
    nextprotoneg
    ocb
    ocsp
    padlockeng
    pic
    pinshared
    poly1305
    posix-io
    psk
    quic
    unstable-qlog
    rc2
    rc4
    rc5
    rdrand
    rfc3779
    rmd160
    scrypt
    sctp
    secure-memory
    seed
    shared
    siphash
    siv
    slh-dsa
    sm2-precomp
    sm3
    sock
    srp
    srtp
    sse2
    ssl
    ssl-trace
    static-engine
    stdio
    tests
    thread-pool
    threads
    tls
    tls-deprecated-ec
    ts
    ui-console
    whirlpool
    zlib
    tls1
    tls1-method
    tls1_1
    tls1_1-method
    tls1_2
    tls1_2-method
    tls1_3
    dtls1
    dtls1-method
    dtls1_2
    dtls1_2-method

Disabled features:

    asan                   [default]        OPENSSL_NO_ASAN
    brotli                 [default]        OPENSSL_NO_BROTLI
    brotli-dynamic         [default]        OPENSSL_NO_BROTLI_DYNAMIC
    buildtest-c++          [default]
    winstore               [not-windows]    OPENSSL_NO_WINSTORE
    crypto-mdebug          [default]        OPENSSL_NO_CRYPTO_MDEBUG
    demos                  [default]        OPENSSL_NO_DEMOS
    h3demo                 [default]        OPENSSL_NO_H3DEMO
    hqinterop              [default]        OPENSSL_NO_HQINTEROP
    devcryptoeng           [default]        OPENSSL_NO_DEVCRYPTOENG
    ec2m                   [option]         OPENSSL_NO_EC2M
    ec_nistp_64_gcc_128    [default]        OPENSSL_NO_EC_NISTP_64_GCC_128
    egd                    [default]        OPENSSL_NO_EGD
    external-tests         [default]        OPENSSL_NO_EXTERNAL_TESTS
    fips-jitter            [default]        OPENSSL_NO_FIPS_JITTER
    fuzz-afl               [default]        OPENSSL_NO_FUZZ_AFL
    fuzz-libfuzzer         [default]        OPENSSL_NO_FUZZ_LIBFUZZER
    jitter                 [default]        OPENSSL_NO_JITTER
    mdc2                   [option]         OPENSSL_NO_MDC2 (skip crypto/mdc2)
    msan                   [default]        OPENSSL_NO_MSAN
    pie                    [default]        OPENSSL_NO_PIE
    sm2                    [option]         OPENSSL_NO_SM2 (skip crypto/sm2)
    sm4                    [option]         OPENSSL_NO_SM4 (skip crypto/sm4)
    sslkeylog              [default]        OPENSSL_NO_SSLKEYLOG
    tfo                    [default]        OPENSSL_NO_TFO
    trace                  [default]        OPENSSL_NO_TRACE
    ubsan                  [default]        OPENSSL_NO_UBSAN
    unit-test              [default]        OPENSSL_NO_UNIT_TEST
    uplink                 [no uplink_arch] OPENSSL_NO_UPLINK
    weak-ssl-ciphers       [default]        OPENSSL_NO_WEAK_SSL_CIPHERS
    zlib-dynamic           [default]        OPENSSL_NO_ZLIB_DYNAMIC
    zstd                   [default]        OPENSSL_NO_ZSTD
    zstd-dynamic           [default]        OPENSSL_NO_ZSTD_DYNAMIC
    ssl3                   [default]        OPENSSL_NO_SSL3
    ssl3-method            [default]        OPENSSL_NO_SSL3_METHOD

Config target attributes:

    AR => "ar",
    ARFLAGS => "qc",
    CC => "gcc",
    CFLAGS => "-Wall -O3",
    CXX => "g++",
    CXXFLAGS => "-Wall -O3",
    HASHBANGPERL => "/usr/bin/env perl",
    OBJCOPY => "objcopy",
    RANLIB => "ranlib",
    RC => "windres",
    asm_arch => "ppc64",
    bin_cflags => "",
    bin_lflags => "",
    bn_ops => "SIXTY_FOUR_BIT_LONG RC4_CHAR",
    build_file => "Makefile",
    build_scheme => [ "unified", "unix" ],
    cflags => "-pthread -m64",
    cppflags => "",
    cxxflags => "-std=c++11 -pthread -m64",
    defines => [ "OPENSSL_BUILDING_OPENSSL", "ZLIB" ],
    disable => [  ],
    dso_ldflags => "-Wl,-z,defs",
    dso_scheme => "dlfcn",
    enable => [ "afalgeng" ],
    ex_libs => "-lz -ldl -pthread",
    includes => [  ],
    lflags => "",
    lib_cflags => "",
    lib_cppflags => "-DOPENSSL_USE_NODELETE -DL_ENDIAN",
    lib_defines => [  ],
    module_cflags => "-fPIC",
    module_cxxflags => undef,
    module_ldflags => "-Wl,-znodelete -shared -Wl,-Bsymbolic",
    multilib => "64",
    perl_platform => "Unix",
    perlasm_scheme => "linux64le",
    shared_cflag => "-fPIC",
    shared_defflag => "-Wl,--version-script=",
    shared_defines => [  ],
    shared_ldflag => "-Wl,-znodelete -shared -Wl,-Bsymbolic",
    shared_rcflag => "",
    shared_sonameflag => "-Wl,-soname=",
    shared_target => "linux-shared",
    thread_defines => [  ],
    thread_scheme => "pthreads",
    unistd => "<unistd.h>",

Recorded environment:

    AR = gcc-ar
    BUILDFILE =
    CC = /grid/common/pkgs/gcc/v12.4.0p2/bin/gcc
    CFLAGS = -std=gnu18  -isystem/grid/common/pkgs/zlib-ng/v2.2.3/include -O3 -fPIC -fno-strict-aliasing -Wall -Wl,--allow-multiple-definition -mcmodel=large -mlongcall -Wl,--no-tls-get-addr-optimize
    CPPFLAGS =
    CROSS_COMPILE =
    CXX = /grid/common/pkgs/gcc/v12.4.0p2/bin/g++
    CXXFLAGS = -std=gnu++20  -isystem/grid/common/pkgs/zlib-ng/v2.2.3/include -O3 -fPIC -fno-strict-aliasing -Wall -mcmodel=large -mlongcall -Wl,--no-tls-get-addr-optimize
    HASHBANGPERL =
    LDFLAGS =
    LDLIBS =
    OPENSSL_LOCAL_CONFIG_DIR =
    PERL =
    RANLIB = gcc-ranlib
    RC =
    RCFLAGS =
    WINDRES =
    __CNF_CFLAGS =
    __CNF_CPPDEFINES =
    __CNF_CPPFLAGS =
    __CNF_CPPINCLUDES =
    __CNF_CXXFLAGS =
    __CNF_LDFLAGS =
    __CNF_LDLIBS =

Makevars:

    AR              = gcc-ar
    ARFLAGS         = qc
    ASFLAGS         =
    CC              = /grid/common/pkgs/gcc/v12.4.0p2/bin/gcc
    CFLAGS          = -std=gnu18  -isystem/grid/common/pkgs/zlib-ng/v2.2.3/include -O3 -fPIC -fno-strict-aliasing -Wall -Wl,--allow-multiple-definition -mcmodel=large -mlongcall -Wl,--no-tls-get-addr-optimize
    CPPDEFINES      = REDHAT_FIPS_VERSION=140-3
    CPPFLAGS        =
    CPPINCLUDES     =
    CXX             = /grid/common/pkgs/gcc/v12.4.0p2/bin/g++
    CXXFLAGS        = -std=gnu++20  -isystem/grid/common/pkgs/zlib-ng/v2.2.3/include -O3 -fPIC -fno-strict-aliasing -Wall -mcmodel=large -mlongcall -Wl,--no-tls-get-addr-optimize
    HASHBANGPERL    = /usr/bin/env perl
    LDFLAGS         =
    LDLIBS          =
    OBJCOPY         = objcopy
    PERL            = /grid/common/pkgsData/perl-v5.38.2/Linux/RHEL8.0-2019-ppc64le/bin/perl
    RANLIB          = gcc-ranlib
    RC              = windres
    RCFLAGS         =

NOTE: These variables only represent the configuration view.  The build file
template may have processed these variables further, please have a look at the
build file for more exact data:
    Makefile

build file:

    Makefile

build file templates:

    ../openssl-3.5.1/Configurations/common0.tmpl
    ../openssl-3.5.1/Configurations/unix-Makefile.tmpl

Compiler Details (name, version)

$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/grid/common/pkgsData/gcc-v12.4.0p2/Linux/RHEL8.0-2019-ppc64le/libexec/gcc/ppc64le-redhat-linux/12.4.0/lto-wrapper
Target: ppc64le-redhat-linux
Configured with: /it/sjcpfb03m2_scratch02/rogerio/20241218_0546_vm-ps-rh84/gcc-v12.4.0/gcc.source/configure --prefix=/grid/common/pkgsData/gcc-v12.4.0p2/Linux/RHEL8.0-2019-ppc64le --with-pkgversion=Cadence --disable-libgcj --enable-threads=posix --enable-shared --with-system-zlib --enable-checking=release --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,fortran --disable-nls --enable-gnu-unique-object --enable-bootstrap --enable-plugin --enable-linker-build-id --enable-gnu-indirect-function --enable-install-libiberty --enable-initfini-array --with-linker-hash-style=gnu --with-ld=/grid/common/pkgsData/gcc-v12.4.0p2/Linux/RHEL8.0-2019-ppc64le/bin/ld --with-as=/grid/common/pkgsData/gcc-v12.4.0p2/Linux/RHEL8.0-2019-ppc64le/bin/as --build=ppc64le-redhat-linux --host=ppc64le-redhat-linux --with-long-double-128 --enable-targets=powerpcle-linux --disable-multilib --with-cpu-64=power7 --with-tune-64=power8
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 12.4.0 (Cadence)

貢獻者指南