Itt az OpenSSL-3.0.0-beta1

Már AIX-on is szinte fordul. Konkrétabban: nem fordul, az első hiba:

crypto/bn/ppc64-mont-fixed.s:4 .p2align 5,,31 -- Assembler: Error In Syntax

Szerk.:
https://www.openssl.org/blog/blog/2018/11/28/version/
Itt ígérik, hogy a verziószám a hármastól kevésbé agilis (mondhatni unalmasan konzervatív) lesz: a 3 a major, a 0.0 a minor (ok, ezt leegyszerűsítettem).
A teória ugye az, hogy a 3.x.y shared object kompatibilisen használható a 3.z.w helyett, ha a x>z vagy x==z és y>=w. Hát reméljük a legjobbakat.

Hozzászólások

Szerkesztve: 2021. 06. 24., cs – 10:45

Mondjuk a 'gas'-nak sikerül: gas -a64 -mpower7 crypto/bn/ppc64-mont-fixed.s

Olvasmány: https://www.ibm.com/docs/en/ssw_aix_72/assembler/assembler_pdf.pdf

The .align pseudo-op is normally used in a control section (csect) that contains data.If the Number parameter evaluates to 0, alignment occurs on a byte boundary. If the Number parameterevaluates to 1, alignment occurs on a halfword boundary. If the Number parameter evaluates to 2,alignment occurs on a word boundary. If the Number parameter evaluates to 3, alignment occurs on a doubleword boundary.
 

.align 0 -- DS 0C a /360-as szintaxissal mondva
.aling 1 -- DS 0H
.align 2 -- DS 0F
.align 3 -- DS 0D

Itt egy kolléga: https://stackoverflow.com/questions/21546946/what-does-p2align-do-in-as…
Megfejtés: https://sourceware.org/binutils/docs/as/P2align.html

.p2align 5,,31 -- 32-byte határra illessze, de csak akkor, ha ezt legfeljebb 31 byte beillesztésével meg tudja oldani.

A source eleje ilyen:


.machine "any"
.csect   .text[PR],7
.align   5
.p2align 5,,31

Ebből arra gondolok, hogy rosszul néztem a leírást, és a .align is tud 32-bájtos határra illeszteni. És valóban, azt írja, hogy:
Number: Specifies an absolute expression that evaluates to an integer value from 0 to 12, inclusive.The value indicates the log base 2 of the desired alignment. For example, an alignment of 8 (a doubleword) would be represented by an integer value of 3; an alignment of 4096 (one page) would be represented by an integer value of 12.

 

Szerk:
a .cfi_startproc és .cfi_endproc sincs az ínyére

Egy régebbi Assembler (AIX 5.3, CPU Power7) meg ezt az utasítást nem szereti: mtvsrd (Move To VSR Doubleword XX1-form)
https://fileadmin.cs.lth.se/cs/education/EDAN25/PowerISA_V2.07_PUBLIC.p…

Szerk: a stxv meg lxv már a 'gas'-nak sem megy (2.25)

A gas-2.36 lesz a barátunk (persze az sem fordul elsőre, dehát meg is sértődnénk, ha fordulna), a -many opcióval. Ilyesmit hevenyészhetünk hozzá:

if [ $(uname -v) -lt 7 -a -f /usr/local/bin/gas ]; then
    cat >local_64_gcc <<"DONE"
#!/bin/sh
f_asm=0
for i; do
    d_arg=$(dirname  -- "$i")
    b_arg=$(basename -- "$i" .s)
    if [ "$d_arg/$b_arg.s" = "$i" ]; then
        echo "Nebassz, assembly: $d_arg/$b_arg.s"
        src_asm="$d_arg/$b_arg.s"
        obj_asm="$d_arg/$b_arg.o"
        f_asm=1
    fi
done
if [ $f_asm -eq 0 ]; then
    set -x
    exec gcc "$@"
else
    set -x
    exec /usr/local/bin/gas -a64 -many -o "$obj_asm" "$src_asm"
fi
DONE
    chmod +x local_64_gcc
    export CC="$(pwd -P)/local_64_gcc"

Most ezen akadtunk meg:

crypto/aes/aesp8-ppc.s:1206: Error: invalid conditional option

cat -n crypto/aes/aesp8-ppc.s

  1204  .aes_p8_ctr32_encrypt_blocks:
  1205          cmpldi  5,1
  1206          bclr    14,0  # NevemTeve: 14(10) = 01110(2)

https://www.ibm.com/docs/en/aix/7.2?topic=set-bclr-bcr-branch-condition…
 

A jó hír pedig az, hogy cmpldi 5,1 ugyanaz, mint a cmpli 0,1,5,1, a jelentése pedig "Compare Logical Word Immediate", ahol az első 0 a BF (Condition Register BitField), az 1 az 'L' (ez valószínűleg a 64-bites működést jelenti), az 5 a regiszter (r5), a végén az 1 pedig a 16 bites literál

Szóval ez simán egy BRANCH-IF-EQUAL akarna lenni, de a 14 (01110(2)) sokkal menőbb, különösen, az IBM is különféle értelmezési lehetőségekről ír (PowerPC, Power, V2.00 Encoding):


PowerPC 011zy: z=0, y=likelyhood
Power:  011zy: z,y tetszőleges, ignored
V2.00:  0111y: y= likelyhood (itt kicsit belebarmoltam, a PDF-ben kb. ugyanez kicsit bonyolultabban van)

Ezt is fejleszteni kellett, ugyanis nagy előrelépés történt: a mocsolade.s fordításának ez eredménye már nem mocsolade.o hanem mashol/lib-mocsolade.o


#!/bin/sh
f_asm=0
object_module=
fnext=

for i; do
    d_arg=$(dirname  -- "$i")
    b_arg=$(basename -- "$i" .s)
    if [ "$fnext" = 'o' ]; then
        object_module="$i";
        fnext=
    elif [ "$d_arg/$b_arg.s" = "$i" ]; then
        echo "Nebassz, assembly: $d_arg/$b_arg.s"
        src_asm="$d_arg/$b_arg.s"
        f_asm=1
        fnext=
    elif [ "$i" = "-o" ]; then
        fnext='o';
    fi
done
if [ $f_asm -eq 0 ]; then
    set -x
    exec gcc "$@"
else
    if [ -z "$object_module" ]; then
        d_asm=$(dirname  -- "$src_asm")
        b_asm=$(basename -- "$src_asm" .s)
        object_module="$d_asm/$b_asm.o"
    fi
    set -x
    exec /usr/local/bin/gas -a64 -mpower7 -many -o "$object_module" "$src_asm"
fi

Van, aki még itt is különbséget keresne:


AIX:   GNU assembler version 2.36.1 () using BFD version (GNU Binutils) 2.36.1
Linux: GNU assembler version 2.25 (x86_64-linux-gnu) using BFD version (GNU Binutils for Debian) 2.25

Segítség: az üres zárójelpárra gondolok az első sorban: ott kellene legyen a host-triplet, vagy micsoda.

Na ez a TARGET_ALIAS szimbóleum, defined in config.h:

/* Target alias. */
#define TARGET_ALIAS ""

Az örökséggel is csak a baj van...


gcc -maix64 -pthread -mtune=native -maix64 -std=gnu11 -pthread -std=gnu99 -O3 -L. -Wl,-G,-bsymbolic,-bnoentry -Wl,-bsvr4 -maix64 -L/usr/local/lib64 -pthread -Wl,-bernotok \
        -o providers/legacy.so -Wl,-bE:providers/legacy.ld \
        providers/legacy-dso-legacyprov.o \
        providers/liblegacy.a providers/libcommon.a -lcrypto -lz -pthread 
ld: 0711-317 ERROR: Undefined symbol: .sha256_block_p8
ld: 0711-317 ERROR: Undefined symbol: .sha256_block_ppc
ld: 0711-317 ERROR: Undefined symbol: .sha512_block_p8
ld: 0711-317 ERROR: Undefined symbol: .sha512_block_ppc
ld: 0711-317 ERROR: Undefined symbol: .ChaCha20_ctr32_int
ld: 0711-317 ERROR: Undefined symbol: .ChaCha20_ctr32_vmx
ld: 0711-317 ERROR: Undefined symbol: .ChaCha20_ctr32_vsx
ld: 0711-317 ERROR: Undefined symbol: .poly1305_init_int
ld: 0711-317 ERROR: Undefined symbol: poly1305_blocks_vsx
ld: 0711-317 ERROR: Undefined symbol: poly1305_emit
ld: 0711-317 ERROR: Undefined symbol: poly1305_blocks

Azt mondanám, hogy ezek igazából nem kellenek a legacy-nak, csak szervezési ügyetlenség miatt szerepelnek extern-ként a történetben. Vagy azt mondom neki, hogy `-Wl,-berok` és felejtsük el egymást, vagy hozzácsapom a libcrypto-hoz, hogy mégis exportálja őket. Persze mindkettő gányolás, úgyhogy megcsinálom a másodikat.

Szerkesztve: 2021. 06. 25., p – 07:16

Ha egy kicsit nem figyelünk, a Configure bepróbálkozik egy ilyennel:


lsattr -E -O -l `lsdev -c processor | awk '{print $1;exit}'` |
grep -i powerpc) >/dev/null 2>&1

Ebből a csukózárójel látszik problémásnak, mivel nincs nyitózárójel.

Most éppen ilyeneket keres rajtam, nyilván én dugtam el őket előle:

ld: 0711-317 ERROR: Undefined symbol: .WPACKET_sub_allocate_bytes__
ld: 0711-317 ERROR: Undefined symbol: .WPACKET_init_static_len
ld: 0711-317 ERROR: Undefined symbol: .WPACKET_put_bytes__
ld: 0711-317 ERROR: Undefined symbol: .WPACKET_cleanup
ld: 0711-317 ERROR: Undefined symbol: .WPACKET_start_sub_packet_len__
ld: 0711-317 ERROR: Undefined symbol: .WPACKET_memcpy
ld: 0711-317 ERROR: Undefined symbol: .WPACKET_close
Szerkesztve: 2021. 07. 08., cs – 10:31

Elkezdhetünk gondolkodni a függő komponenseken:

wget
lynx
curl
apr/apr-util/httpd/tomcat-connector/tomcat-native
php8: --with-openssl=no (vagyis nem megy az OpenSSL3-mal)
libzip
cmake
git

Valahogy bekerült a libcrypto.la-ba dependenciaként a 'libcommon.a' meg a 'libdefault.a'. Nyomozni kellene.

Szerkesztve: 2021. 07. 08., cs – 07:47

Azt mondja a tomcat_native-1.2.30, hogy ő szívesen venne egy OCSP_HTTP_parse_url nevű metódust, hamár OPENSSL3.
Csak sajnos ilyen nincsen. Nemhogy az exportált szimbóleumok között, de még a ChangeLog-ban sem.
Na ha megnézzük a manualt, minden tiszta lesz:


        int OSSL_parse_url(const char *url, char **pscheme, char **puser, char **phost,
                           char **pport, int *pport_num,
                           char **ppath, char **pquery, char **pfrag);
        int OSSL_HTTP_parse_url(const char *url,
                                int *pssl, char **puser, char **phost,
                                char **pport, int *pport_num,
                                char **ppath, char **pquery, char **pfrag);

Nem OCSP_, hanem OSSL_. Nyilván sokszorosára növeli a sebességet is egy ilyen átnevezés. Persze ettől még sokminden deprecated lett, de egyelőre működik.

https://bz.apache.org/bugzilla/show_bug.cgi?id=65441

Szerkesztve: 2021. 08. 09., h – 10:24

ssh most hirtelen ezzel állt elő:

$ git push
ssh: relocation error: ssh: symbol EVP_CIPHER_CTX_key_length, version OPENSSL_3.0.0 not defined in file libcrypto.so.3 with link time reference

Na most ilyen tényleg nincs, de valószínűnek tűnik, hogy korábban volt, csak időközben átnevezték/megszüntették. Most ilyenek vannak:

nm -D /usr/local/lib64/libcrypto.so.3 | grep EVP_CIPHER_CTX.*key_length
00000000001eb9d0 T EVP_CIPHER_CTX_get_key_length@@OPENSSL_3.0.0
00000000001e7d90 T EVP_CIPHER_CTX_set_key_length@@OPENSSL_3.0.0

És tényleg, alpha17 és beta1 között változott az "evp.h":

int EVP_CIPHER_CTX_get_key_length(const EVP_CIPHER_CTX *ctx);
# define EVP_CIPHER_CTX_key_length EVP_CIPHER_CTX_get_key_length

A logikus lépés az, hogy frissítek beta2-re: https://www.openssl.org/source/

Továbbá:

httpd: Syntax error on line 139 of /usr/local/etc/apache2/httpd.conf:
Cannot load libexec64/apache2/mod_ssl.so into server:
/usr/local/libexec64/apache2/mod_ssl.so:
undefined symbol: ERR_GET_FUNC

Értelemszerűen ezt kell csinálni:

OSLDIR=$(set -- $(openssl version -d | tr -d '"'); echo ${2%/ssl}/include)
grep ERR_GET_FUNC "$OSLDIR" || \
sed_repl 's;ERR_GET_FUNC(ERR_peek_last_error());0;' \
  modules/ssl/ssl_engine_init.c
Szerkesztve: 2021. 08. 16., h – 11:17

Egy újabb gépen (AIX7.2, gcc-8.3.0) meg a binutils-2.36.1/libiberty nem óhajt fordulni:

In file included from ./cp-demangle.c:138:
./../include/libiberty.h:317:74: error: expected ',' or ';' before 'ATTRIBUTE_RESULT_SIZE_1'
 extern void *xmalloc (size_t) ATTRIBUTE_MALLOC ATTRIBUTE_RETURNS_NONNULL
  ATTRIBUTE_RESULT_SIZE_1 ATTRIBUTE_WARN_UNUSED_RESULT;

#define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
#define ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
-- ATTRIBUTE_RESULT_SIZE_1 -- undefined
-- ATTRIBUTE_WARN_UNUSED_RESULT -- undefined
Szerkesztve: 2021. 08. 31., k – 20:16

Lehet, hogy ebből nem lesz 32-bites verzió:

ld: 0711-317 ERROR: Undefined symbol: .__atomic_is_lock_free
ld: 0711-317 ERROR: Undefined symbol: .__atomic_fetch_or_8
ld: 0711-317 ERROR: Undefined symbol: .__atomic_load_8
ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information.

Esetleg a LDFLAGS-ba egy ilyen részlet: $(gcc -pthread -print-file-name=libatomic.a)

Egy másik készüléken:

gcc: error: unrecognized command line option '-no-whole-archive'
gcc version 4.8.3 (GCC)