openssl/openssl
在 GitHub 查看The "constructor" function attribute caused relocation overflow on ppc64le
Open
#31,242 建立於 2026年5月19日
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)