Skip to content

Building OpenSSL 1.1.1b on Sparc Solaris 11.1: libcrypto.so: "read-only segment has dynamic relocations" #8936

@vladr

Description

@vladr

Building OpenSSL 1.1.1b from source on Sparc Solaris 11.1 w/ gcc 4.8.2 and binutils 2.23.2 configured to use GNU ld (full config output at the bottom FWIW).

The following error occurs while linking libcrypto.so:

.../bin/ld: read-only segment has dynamic relocations.
collect2: error: ld returned 1 exit status

The error disappears if crypto/ec/ecp_nistz256-sparcv9.o is excluded from the ld arguments; looking at the problematic .o:

$ objdump -r .../openssl-1.1.1b/crypto/ec/ecp_nistz256-sparcv9.o

.../openssl-1.1.1b/crypto/ec/ecp_nistz256-sparcv9.o:     file format elf64-sparc-sol2

RELOCATION RECORDS FOR [.text]:
OFFSET           TYPE              VALUE
0000000000025da4 R_SPARC_PC22      _GLOBAL_OFFSET_TABLE_-0x0000000000000004
0000000000025dac R_SPARC_PC10      _GLOBAL_OFFSET_TABLE_+0x0000000000000004
0000000000025db0 R_SPARC_GOT22     OPENSSL_sparcv9cap_P
0000000000025db4 R_SPARC_GOT10     OPENSSL_sparcv9cap_P
0000000000025f24 R_SPARC_PC22      _GLOBAL_OFFSET_TABLE_-0x0000000000000004
0000000000025f2c R_SPARC_PC10      _GLOBAL_OFFSET_TABLE_+0x0000000000000004
0000000000025f30 R_SPARC_GOT22     OPENSSL_sparcv9cap_P
0000000000025f34 R_SPARC_GOT10     OPENSSL_sparcv9cap_P
0000000000025f4c R_SPARC_WDISP22   ecp_nistz256_point_add_vis3
0000000000026484 R_SPARC_PC22      _GLOBAL_OFFSET_TABLE_-0x0000000000000004
000000000002648c R_SPARC_PC10      _GLOBAL_OFFSET_TABLE_+0x0000000000000004
0000000000026490 R_SPARC_GOT22     OPENSSL_sparcv9cap_P
0000000000026494 R_SPARC_GOT10     OPENSSL_sparcv9cap_P

Looking at crypto/ec/asm/ecp_nistz256-sparcv9.pl, it appears that the problem might be with ecp_nistz256_point_add_vis3 being .globl as well as referenced in a branch instruction. The following change appears to fix the problem:

--- openssl-1.1.1b.orig/crypto/ec/asm/ecp_nistz256-sparcv9.pl   2019-02-26 09:15:30.000000000 -0400
+++ openssl-1.1.1b/crypto/ec/asm/ecp_nistz256-sparcv9.pl        2019-05-16 00:31:36.000000000 -0400
@@ -2301,7 +2301,6 @@
 # !in1infty, !in2infty and result of check for zero.

 $code.=<<___;
-.globl ecp_nistz256_point_add_vis3
 .align 32
 ecp_nistz256_point_add_vis3:
        save    %sp,-STACK64_FRAME-32*18-32,%sp

$ perl .../openssl-1.1.1b/configdata.pm --dump

Command line (with current working directory = .../openssl-1.1.1b):

    .../perl64-5.10.1/bin/perl ./Configure --prefix=.../openssl enable-shared enable-threads enable-ssl3 enable-ssl3-method enable-weak-ssl-ciphers enable-ssl-trace solaris64-sparcv9-gcc -Wl,-rpath,\$$ORIGIN/../lib/sparcv9

Perl information:

    perl
    5.10.1 for sun4-solaris-64

Enabled features:

    aria
    asm
    async
    autoalginit
    autoerrinit
    autoload-config
    bf
    blake2
    camellia
    capieng
    cast
    chacha
    cmac
    cms
    comp
    ct
    deprecated
    des
    dgram
    dh
    dsa
    dso
    dtls
    dynamic-engine
    ec
    ec2m
    ecdh
    ecdsa
    engine
    err
    filenames
    gost
    hw(-.+)?
    idea
    makedepend
    md4
    mdc2
    multiblock
    nextprotoneg
    pinshared
    ocb
    ocsp
    pic
    poly1305
    posix-io
    psk
    rc2
    rc4
    rdrand
    rfc3779
    rmd160
    scrypt
    seed
    shared
    siphash
    sm2
    sm3
    sm4
    sock
    srp
    srtp
    sse2
    ssl
    ssl-trace
    static-engine
    stdio
    tests
    threads
    tls
    ts
    ui-console
    whirlpool
    weak-ssl-ciphers
    ssl3
    ssl3-method
    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:

    afalgeng                [not-linux]
    asan                    [default]   OPENSSL_NO_ASAN
    crypto-mdebug           [default]   OPENSSL_NO_CRYPTO_MDEBUG
    crypto-mdebug-backtrace [default]   OPENSSL_NO_CRYPTO_MDEBUG_BACKTRACE
    devcryptoeng            [default]   OPENSSL_NO_DEVCRYPTOENG
    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
    fuzz-libfuzzer          [default]   OPENSSL_NO_FUZZ_LIBFUZZER
    fuzz-afl                [default]   OPENSSL_NO_FUZZ_AFL
    heartbeats              [default]   OPENSSL_NO_HEARTBEATS
    md2                     [default]   OPENSSL_NO_MD2 (skip crypto/md2)
    msan                    [default]   OPENSSL_NO_MSAN
    rc5                     [default]   OPENSSL_NO_RC5 (skip crypto/rc5)
    sctp                    [default]   OPENSSL_NO_SCTP
    ubsan                   [default]   OPENSSL_NO_UBSAN
    unit-test               [default]   OPENSSL_NO_UNIT_TEST
    zlib                    [default]
    zlib-dynamic            [default]

Config target attributes:

    AR => "ar",
    ARFLAGS => "r",
    CC => "gcc",
    CFLAGS => "-Wall -O3",
    HASHBANGPERL => "/usr/bin/env perl",
    RANLIB => "ranlib",
    RC => "windres",
    aes_asm_src => "aes_core.c aes_cbc.c aes-sparcv9.S aest4-sparcv9.S aesfx-sparcv9.S",
    aes_obj => "aes_core.o aes_cbc.o aes-sparcv9.o aest4-sparcv9.o aesfx-sparcv9.o",
    apps_aux_src => "",
    apps_init_src => "",
    apps_obj => "",
    bf_asm_src => "bf_enc.c",
    bf_obj => "bf_enc.o",
    bn_asm_src => "asm/sparcv8plus.S sparcv9-mont.S sparcv9a-mont.S vis3-mont.S sparct4-mont.S sparcv9-gf2m.S",
    bn_obj => "asm/sparcv8plus.o sparcv9-mont.o sparcv9a-mont.o vis3-mont.o sparct4-mont.o sparcv9-gf2m.o",
    bn_ops => "BN_LLONG RC4_CHAR",
    build_file => "Makefile",
    build_scheme => [ "unified", "unix" ],
    cast_asm_src => "c_enc.c",
    cast_obj => "c_enc.o",
    cflags => "-m64 -mcpu=ultrasparc -pthread",
    chacha_asm_src => "chacha_enc.c",
    chacha_obj => "chacha_enc.o",
    cmll_asm_src => "camellia.c cmll_misc.c cmll_cbc.c cmllt4-sparcv9.S",
    cmll_obj => "camellia.o cmll_misc.o cmll_cbc.o cmllt4-sparcv9.o",
    cppflags => "",
    cpuid_asm_src => "sparcv9cap.c sparccpuid.S",
    cpuid_obj => "sparcv9cap.o sparccpuid.o",
    defines => [  ],
    des_asm_src => "des_enc-sparc.S fcrypt_b.c dest4-sparcv9.S",
    des_obj => "des_enc-sparc.o fcrypt_b.o dest4-sparcv9.o",
    disable => [  ],
    dso_extension => ".so",
    dso_scheme => "dlfcn",
    ec_asm_src => "ecp_nistz256.c ecp_nistz256-sparcv9.S",
    ec_obj => "ecp_nistz256.o ecp_nistz256-sparcv9.o",
    enable => [  ],
    ex_libs => "-lsocket -lnsl -ldl -pthread",
    exe_extension => "",
    includes => [  ],
    keccak1600_asm_src => "keccak1600.c",
    keccak1600_obj => "keccak1600.o",
    lflags => "",
    lib_cflags => "",
    lib_cppflags => "-DFILIO_H -DB_ENDIAN -DBN_DIV2W",
    lib_defines => [  ],
    md5_asm_src => "md5-sparcv9.S",
    md5_obj => "md5-sparcv9.o",
    modes_asm_src => "ghash-sparcv9.S",
    modes_obj => "ghash-sparcv9.o",
    module_cflags => "-fPIC",
    module_cxxflags => "",
    module_ldflags => "-shared",
    multilib => "/64",
    padlock_asm_src => "",
    padlock_obj => "",
    perlasm_scheme => "void",
    poly1305_asm_src => "poly1305-sparcv9.S",
    poly1305_obj => "poly1305-sparcv9.o",
    rc4_asm_src => "rc4_enc.c rc4_skey.c",
    rc4_obj => "rc4_enc.o rc4_skey.o",
    rc5_asm_src => "rc5_enc.c",
    rc5_obj => "rc5_enc.o",
    rmd160_asm_src => "",
    rmd160_obj => "",
    sha1_asm_src => "sha1-sparcv9.S sha256-sparcv9.S sha512-sparcv9.S",
    sha1_obj => "sha1-sparcv9.o sha256-sparcv9.o sha512-sparcv9.o",
    shared_cflag => "-fPIC",
    shared_defines => [  ],
    shared_extension => ".so",
    shared_extension_simple => ".so",
    shared_ldflag => "-shared",
    shared_rcflag => "",
    shared_target => "solaris-gcc",
    thread_defines => [  ],
    thread_scheme => "pthreads",
    unistd => "<unistd.h>",
    uplink_aux_src => "",
    uplink_obj => "",
    wp_asm_src => "wp_block.c",
    wp_obj => "wp_block.o",

Recorded environment:

    AR =
    BUILDFILE =
    CC = .../bin/gcc -m64
    CROSS_COMPILE =
    CXX = .../bin/g++ -m64
    HASHBANGPERL =
    OPENSSL_LOCAL_CONFIG_DIR =
    PERL = .../perl64-5.10.1/bin/perl
    RANLIB =
    RC =
    WINDRES =
    __CNF_CFLAGS =
    __CNF_CPPDEFINES =
    __CNF_CPPFLAGS =
    __CNF_CPPINCLUDES =
    __CNF_CXXFLAGS =
    __CNF_LDFLAGS =
    __CNF_LDLIBS =

Makevars:

    AR              = ar
    ARFLAGS         = r
    CC              = .../bin/gcc -m64
    CFLAGS          = -Wall -O3
    CPPDEFINES      =
    CPPFLAGS        =
    CPPINCLUDES     =
    CXX             = .../bin/g++ -m64
    CXXFLAGS        =
    HASHBANGPERL    = .../perl64-5.10.1/bin/perl
    LDFLAGS         = -Wl,-rpath,\$$ORIGIN/../lib/sparcv9
    LDLIBS          =
    PERL            = .../perl64-5.10.1/bin/perl
    RANLIB          = ranlib
    RC              = windres

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:
    .../openssl-1.1.1b/Makefile

build file:

    .../openssl-1.1.1b/Makefile

build file templates:

    .../openssl-1.1.1b/Configurations/common0.tmpl
    .../openssl-1.1.1b/Configurations/unix-Makefile.tmpl
    .../openssl-1.1.1b/Configurations/common.tmpl

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions