Ubuntu20でPHP5.6のコンパイルが通らない時の対処方法

最新のOSとWebサーバーにPHP5.6をインストールしてくれだって!?

具体的にはUbuntu20にApache2.4系をインストールし、PHP5.6のLatestバージョン、とは言え、とっくにサポート期間終了したものをインストールするという内容。

なぜこのようなオーダーがあるのか、想像できるかな?

いや、この記事に辿り着いたということは、想像する必要はないのかもね?

Ubuntu20でPHP5.6のビルドエラー

/opt/local/src/php/php-5.6.40/ext/openssl/openssl.c: In function ‘add_assoc_name_entry’:
/opt/local/src/php/php-5.6.40/ext/openssl/openssl.c:664:4: warning: ‘ASN1_STRING_data’ is deprecated [-Wdeprecated-declarations]
  664 |    to_add = ASN1_STRING_data(str);
      |    ^~~~~~
In file included from /usr/local/openssl/include/openssl/evp.h:13,
                 from /opt/local/src/php/php-5.6.40/ext/openssl/openssl.c:44:
/usr/local/openssl/include/openssl/asn1.h:554:35: note: declared here
  554 | DEPRECATEDIN_1_1_0(unsigned char *ASN1_STRING_data(ASN1_STRING *x))
      |                                   ^~~~~~~~~~~~~~~~
/usr/local/openssl/include/openssl/opensslconf.h:115:37: note: in definition of macro ‘DECLARE_DEPRECATED’
  115 | #   define DECLARE_DEPRECATED(f)    f __attribute__ ((deprecated));
      |                                     ^
/opt/local/src/php/php-5.6.40/ext/openssl/openssl.c: In function ‘zif_openssl_digest’:
/opt/local/src/php/php-5.6.40/ext/openssl/openssl.c:5154:13: error: storage size of ‘md_ctx’ isn’t known
 5154 |  EVP_MD_CTX md_ctx;
      |             ^~~~~~
/opt/local/src/php/php-5.6.40/ext/openssl/openssl.c: In function ‘zif_openssl_encrypt’:
/opt/local/src/php/php-5.6.40/ext/openssl/openssl.c:5233:17: error: storage size of ‘cipher_ctx’ isn’t known
 5233 |  EVP_CIPHER_CTX cipher_ctx;
      |                 ^~~~~~~~~~
/opt/local/src/php/php-5.6.40/ext/openssl/openssl.c: In function ‘zif_openssl_decrypt’:
/opt/local/src/php/php-5.6.40/ext/openssl/openssl.c:5316:17: error: storage size of ‘cipher_ctx’ isn’t known
 5316 |  EVP_CIPHER_CTX cipher_ctx;
      |                 ^~~~~~~~~~
make: *** [Makefile:539: ext/openssl/openssl.lo] Error 1

OpenSSL関連のエラーが表示され、PHP5系との相性の悪さが露呈したところである。

Ubuntu20のOpenSSLバージョン

openssl version

Ubuntu 20.04.3 LTSにインストールされているOpenSSLのバージョンを確認すると、OpenSSL 1.1.1f 31 Mar 2020 と表示される。

ビルドエラー時のPHPのconfigureオプション

./configure \
--sysconfdir=/etc/php \
--sbindir=/usr/local/php/sbin \
--with-config-file-path=/etc/php \
--with-config-file-path=/etc/httpd/conf \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mysql \
--with-mysqli=mysqlnd \
--with-pdo_mysql=mysqlnd \
--with-zlib \
--with-zlib-dir=/usr \
--with-gd \
--with-vpx-dir=/usr/include/vpx \
--with-xpm-dir=/usr/include/X11 \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-mcrypt=/usr/local \
--with-openssl \
--enable-gd-jis-conv \
--enable-sysvsem \
--enable-sysvshm \
--enable-mbstring \
--enable-mbregex \
--enable-gd-native-ttf

この状況で、あなただったらどのように料理する?

  • PHP5.xのopenssl-1.1x系のパッチを探す。
  • PHP5.xのopenssl-1.1x系のパッチを作る。

どちらも思うような結果が得られなかったNeo隊長はopenssl-1.0.2uをソースコードからインストールして、PHPのconfigureオプションを次のように変更。

OpenSSLディレクトリを指定したPHPのconfigureオプション

18行目 opensslインストールディレクトリを指定。
19行目 –with-openssl-dirを追記。

./configure \
--sysconfdir=/etc/php \
--sbindir=/usr/local/php/sbin \
--with-config-file-path=/etc/php \
--with-config-file-path=/etc/httpd/conf \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mysql \
--with-mysqli=mysqlnd \
--with-pdo_mysql=mysqlnd \
--with-zlib \
--with-zlib-dir=/usr \
--with-gd \
--with-vpx-dir=/usr/include/vpx \
--with-xpm-dir=/usr/include/X11 \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-mcrypt=/usr/local \
--with-openssl=/usr/local/openssl \
--with-openssl-dir=/usr/local/openssl \
--enable-gd-jis-conv \
--enable-sysvsem \
--enable-sysvshm \
--enable-mbstring \
--enable-mbregex \
--enable-gd-native-ttf

-fPICをつけて再コンパイル

/usr/bin/ld: /usr/local/openssl/lib/libcrypto.a(v3_genn.o): relocation R_X86_64_PC32 against symbol `GENERAL_NAME_it' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make: *** [Makefile:138: libphp5.la] Error 1

can not be used when making a shared object; recompile with -fPIC

エラーという結果になったものの、configオプションに「-fPIC」をつけてリコンパイルすればいいと書かれている。

-fPICをつけてリコンパイルとはどういうことなのか、続きはsu.Cookbookで!!

関連記事

コメント

この記事へのコメントはありません。