質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

2268閲覧

実行時にロードされる共有オブジェクトについて

rx179mk5

総合スコア33

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2019/05/06 13:26

すごい根本的な事なのですが、教えて下さい。
現在、PHP7.3.5をソースからのインストールを試みています。
依存しているLDAP、SSH、SNMP、MySQLに関するライブラリも自前でコンパイルしてインストールしています。

configureは以下のように実行しました。

./configure
--prefix=/var/home/ap/php
--enable-fpm
--with-config-file-path=/var/home/ap/php/etc
--with-config-file-scan-dir=/var/home/ap/php/etc
--enable-libgcc
--with-openssl=/var/home/lib/openssl
--with-zlib=/var/home/lib/zlib
--with-zlib-dir=/var/home/lib/zlib
--with-bz2
--enable-calendar
--with-curl
--enable-dba=shared
--enable-exif
--with-gd
--with-jpeg-dir=/usr
--with-png-dir=/usr
--with-xpm-dir=/usr
--with-freetype-dir=/usr
--enable-gd-jis-conv
--with-gettext
--with-ldap=/var/home/lib/openldap
--enable-mbstring
--with-mysqli=/var/home/ap/mysql/bin/mysql_config
--enable-pcntl
--with-pdo-mysql=/var/home/ap/mysql/
--with-zlib-dir=/var/home/lib/zlib
--with-readline
--with-snmp=/var/home/lib/net-snmp
--with-openssl-dir=/var/home/lib/openssl
--enable-soap
--enable-sockets
--with-xmlrpc
--with-xsl
--enable-zip
--with-zlib-dir=/var/home/lib/zlib
--with-libzip=/var/home/lib/libzip
--with-tsrm-pthreads
--enable-shared

そして、Makefileを以下のように修正しました。

EXTRA_LDFLAGS = -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/var/home/lib/openssl/lib -L/var/home/lib/zlib/lib -L/var/home/lib/openldap/lib -L/var/home/ap/mysql/lib -L/var/home/ap/mysql//lib -L/var/home/lib/net-snmp/lib -L/usr/lib64 -L/var/home/lib/libzip/lib

EXTRA_LDFLAGS = -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/var/home/lib/openssl/lib -L/var/home/lib/libssh2/lib -L/var/home/lib/zlib/lib -L/var/home/lib/libzip/lib -L/var/home/lib/openldap/lib -L/var/home/ap/mysql/lib -L/var/home/lib/net-snmp/lib -L/usr/lib64

EXTRA_LDFLAGS_PROGRAM = -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/var/home/lib/openssl/lib -L/var/home/lib/zlib/lib -L/var/home/lib/openldap/lib -L/var/home/ap/mysql/lib -L/var/home/ap/mysql//lib -L/var/home/lib/net-snmp/lib -L/usr/lib64 -L/var/home/lib/libzip/lib

EXTRA_LDFLAGS_PROGRAM = -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/var/home/lib/openssl/lib -L/var/home/lib/libssh2/lib -L/var/home/lib/zlib/lib -L/var/home/lib/libzip/lib -L/var/home/lib/openldap/lib -L/var/home/ap/mysql/lib -L/var/home/lib/net-snmp/lib -L/usr/lib64

INCLUDES = -I/var/home/src/php-7.3.5/ext/date/lib -I/usr/include/libxml2 -I/var/home/lib/openssl/include -I/var/home/lib/zlib/include -I/usr/X11 -I/usr/include/freetype2 -I/usr/include/libpng15 -I/var/home/lib/openldap/include -I/var/home/src/php-7.3.5/ext/mbstring/oniguruma -I/var/home/src/php-7.3.5/ext/mbstring/libmbfl -I/var/home/src/php-7.3.5/ext/mbstring/libmbfl/mbfl -I/var/home/ap/mysql/include -I/var/home/ap/mysql//include -I/var/home/src/php-7.3.5/ext/sqlite3/libsqlite -I/var/home/lib/net-snmp/include -I$(top_builddir)/TSRM -I$(top_builddir)/Zend

INCLUDES = -I/var/home/src/php-7.3.5/ext/date/lib -I/usr/include/libxml2 -I/var/home/lib/openssl/include -I/var/home/lib/libssh2/include -I/var/home/lib/zlib/include -I/var/home/lib/libzip/include -I/usr/X11 -I/usr/include/freetype2 -I/usr/include/libpng15 -I/var/home/lib/openldap/include -I/var/home/src/php-7.3.5/ext/mbstring/oniguruma -I/var/home/src/php-7.3.5/ext/mbstring/libmbfl -I/var/home/src/php-7.3.5/ext/mbstring/libmbfl/mbfl -I/var/home/ap/mysql/include -I/var/home/ap/mysql//include -I/var/home/src/php-7.3.5/ext/sqlite3/libsqlite -I/var/home/lib/net-snmp/include -I$(top_builddir)/TSRM -I$(top_builddir)/Zend

NATIVE_RPATHS = -Wl,-rpath,/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -Wl,-rpath,/var/home/lib/openssl/lib -Wl,-rpath,/var/home/lib/zlib/lib -Wl,-rpath,/var/home/lib/openldap/lib -Wl,-rpath,/var/home/ap/mysql/lib -Wl,-rpath,/var/home/ap/mysql//lib -Wl,-rpath,/var/home/lib/net-snmp/lib -Wl,-rpath,/usr/lib64 -Wl,-rpath,/var/home/lib/libzip/lib

NATIVE_RPATHS = -Wl,-rpath,/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -Wl,-rpath,/var/home/lib/openssl/lib -Wl,-rpath,/var/home/lib/libssh2/lib -Wl,-rpath,/var/home/lib/zlib/lib -Wl,-rpath,/var/home/lib/libzip/lib -Wl,-rpath,/var/home/lib/openldap/lib -Wl,-rpath,/var/home/ap/mysql/lib -Wl,-rpath,/var/home/lib/net-snmp/lib -Wl,-rpath,/usr/lib64

PHP_LDFLAGS = -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/var/home/lib/openssl/lib -L/var/home/lib/zlib/lib -L/var/home/lib/openldap/lib -L/var/home/ap/mysql/lib -L/var/home/ap/mysql//lib -L/var/home/lib/net-snmp/lib -L/usr/lib64 -L/var/home/lib/libzip/lib

PHP_LDFLAGS = -L/usr/lib/gcc/x86_64-redhat-linux/4.8.5 -L/var/home/lib/openssl/lib -L/var/home/lib/libssh2/lib -L/var/home/lib/zlib/lib -L/var/home/lib/libzip/lib -L/var/home/lib/openldap/lib -L/var/home/ap/mysql/lib -L/var/home/lib/net-snmp/lib -L/usr/lib64

PHP_RPATHS = -R /usr/lib/gcc/x86_64-redhat-linux/4.8.5 -R /var/home/lib/openssl/lib -R /var/home/lib/zlib/lib -R /var/home/lib/openldap/lib -R /var/home/ap/mysql/lib -R /var/home/ap/mysql//lib -R /var/home/lib/net-snmp/lib -R /usr/lib64 -R /var/home/lib/libzip/lib

PHP_RPATHS = -R /usr/lib/gcc/x86_64-redhat-linux/4.8.5 -R /var/home/lib/openssl/lib -R /var/home/lib/libssh2/lib -R /var/home/lib/zlib/lib -R /var/home/lib/libzip/lib -R /var/home/lib/openldap/lib -R /var/home/ap/mysql/lib -R /var/home/lib/net-snmp/lib -R /usr/lib64

コンパイルすると問題なくバイナリが生成されます。
そして、readelf --dynamic phpでロードする共有オブジェクトの情報を表示すると以下の通り表示されます。

Dynamic section at offset 0xde4880 contains 53 entries:
タグ タイプ 名前/値
0x0000000000000001 (NEEDED) 共有ライブラリ: [libcrypt.so.1]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libzip.so.5]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libz.so.1]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libexslt.so.0]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libreadline.so.6]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libncurses.so.5]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libtinfo.so.5]
0x0000000000000001 (NEEDED) 共有ライブラリ: [librt.so.1]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libX11.so.6]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libXpm.so.4]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libpng15.so.15]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libjpeg.so.62]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libbz2.so.1]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libcrypto.so.1.0.0]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libm.so.6]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libdl.so.2]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libnsl.so.1]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libxml2.so.2]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libcurl.so.4]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libfreetype.so.6]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libmysqlclient.so.20]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libxslt.so.1]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libldap-2.4.so.2]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libsasl2.so.3]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libssl.so.1.0.0]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libnetsnmp.so.30]
0x0000000000000001 (NEEDED) 共有ライブラリ: [liblber-2.4.so.2]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libresolv.so.2]
0x0000000000000001 (NEEDED) 共有ライブラリ: [libc.so.6]
0x000000000000000f (RPATH) ライブラリの rpath: [/var/home/lib/openldap/lib:/var/home/lib/net-snmp/lib:/usr/lib/gcc/x86_64-redhat-linux/4.8.5:/var/home/lib/openssl/lib:/var/home/lib/libssh2/lib:/var/home/lib/zlib/lib:/var/home/lib/libzip/lib:/var/home/ap/mysql/lib:/usr/lib64]
0x000000000000000c (INIT) 0x433f20
0x000000000000000d (FINI) 0x8e63a0
0x0000000000000019 (INIT_ARRAY) 0x1328788
0x000000000000001b (INIT_ARRAYSZ) 8 (バイト)
0x000000000000001a (FINI_ARRAY) 0x1328790
0x000000000000001c (FINI_ARRAYSZ) 8 (バイト)
0x000000006ffffef5 (GNU_HASH) 0x400298
0x0000000000000005 (STRTAB) 0x419190
0x0000000000000006 (SYMTAB) 0x404b80
0x000000000000000a (STRSZ) 68352 (バイト)
0x000000000000000b (SYMENT) 24 (バイト)
0x0000000000000015 (DEBUG) 0x0
0x0000000000000003 (PLTGOT) 0x13e5000
0x0000000000000002 (PLTRELSZ) 31368 (バイト)
0x0000000000000014 (PLTREL) RELA
0x0000000000000017 (JMPREL) 0x42c498
0x0000000000000007 (RELA) 0x42ba90
0x0000000000000008 (RELASZ) 2568 (バイト)
0x0000000000000009 (RELAENT) 24 (バイト)
0x000000006ffffffe (VERNEED) 0x42b7c0
0x000000006fffffff (VERNEEDNUM) 10
0x000000006ffffff0 (VERSYM) 0x429c90
0x0000000000000000 (NULL) 0x0

libldap-2.4.so.2は、/var/home/lib/openldap/lib(自分でインストールした方)と/usr/lib64(OSに元々入っていた方)にあります。php実行においては、/var/home/lib/openldap/libが先に検索されて、/var/home/lib/openldap/libにあるlibldap-2.4.so.2がロードされるのでしょうか?

ランタイム環境の質問で、どちらかというとインフラ系の質問になるとは思いますが、ご回答頂ければ幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otolab

2019/05/06 14:45

lddで調べるとどのような結果になりますか?
rx179mk5

2019/05/07 07:24

lddの出力は以下のようになります。 また、LD_LIBRARY_PATHを設定しており、パスの内容は以下のようになります。 LD_LIBRARY_PATH=/var/home/lib/net-snmp/lib:/var/home/lib/openldap/lib:/var/home/lib/libssh2/lib:/var/home/lib/zlib/lib:/var/home/lib/libzip/lib:/var/home/lib/libzip/lib64:/var/home/ap/porg/lib:/var/home/lib/icu/lib:/var/home/lib/openssl/lib:/var/home/lib/boost/lib:/var/home/ap/mysql/lib:/var/home/lib/libmcrypt/lib:/var/home/ap/ruby/lib ldd php linux-vdso.so.1 => (0x00007fff47ddb000) libcrypt.so.1 => /usr/lib64/libcrypt.so.1 (0x00007f8e22e3d000) libzip.so.5 => /var/home/lib/libzip/lib/libzip.so.5 (0x00007f8e22c1e000) libz.so.1 => /var/home/lib/zlib/lib/libz.so.1 (0x00007f8e22a03000) libexslt.so.0 => /usr/lib64/libexslt.so.0 (0x00007f8e227ee000) libreadline.so.6 => /usr/lib64/libreadline.so.6 (0x00007f8e225a8000) libncurses.so.5 => /usr/lib64/libncurses.so.5 (0x00007f8e22381000) libtinfo.so.5 => /usr/lib64/libtinfo.so.5 (0x00007f8e22157000) librt.so.1 => /usr/lib64/librt.so.1 (0x00007f8e21f4f000) libX11.so.6 => /usr/lib64/libX11.so.6 (0x00007f8e21c11000) libXpm.so.4 => /usr/lib64/libXpm.so.4 (0x00007f8e219ff000) libpng15.so.15 => /usr/lib64/libpng15.so.15 (0x00007f8e217d4000) libjpeg.so.62 => /usr/lib64/libjpeg.so.62 (0x00007f8e2157f000) libbz2.so.1 => /usr/lib64/libbz2.so.1 (0x00007f8e2136f000) libcrypto.so.1.0.0 => /var/home/lib/openssl/lib/libcrypto.so.1.0.0 (0x00007f8e20f1b000) libm.so.6 => /usr/lib64/libm.so.6 (0x00007f8e20c19000) libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007f8e20a15000) libnsl.so.1 => /usr/lib64/libnsl.so.1 (0x00007f8e207fb000) libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00007f8e20491000) libcurl.so.4 => /usr/lib64/libcurl.so.4 (0x00007f8e20228000) libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00007f8e1ff69000) libmysqlclient.so.20 => /var/home/ap/mysql/lib/libmysqlclient.so.20 (0x00007f8e1f94f000) libxslt.so.1 => /usr/lib64/libxslt.so.1 (0x00007f8e1f710000) libldap-2.4.so.2 => /var/home/lib/openldap/lib/libldap-2.4.so.2 (0x00007f8e1f4c6000) libsasl2.so.3 => /usr/lib64/libsasl2.so.3 (0x00007f8e1f2a9000) libssl.so.1.0.0 => /var/home/lib/openssl/lib/libssl.so.1.0.0 (0x00007f8e1f037000) libnetsnmp.so.30 => /var/home/lib/net-snmp/lib/libnetsnmp.so.30 (0x00007f8e1ed5c000) liblber-2.4.so.2 => /var/home/lib/openldap/lib/liblber-2.4.so.2 (0x00007f8e1eb4d000) libresolv.so.2 => /usr/lib64/libresolv.so.2 (0x00007f8e1e934000) libc.so.6 => /usr/lib64/libc.so.6 (0x00007f8e1e567000) libfreebl3.so => /usr/lib64/libfreebl3.so (0x00007f8e1e364000) libgcrypt.so.11 => /usr/lib64/libgcrypt.so.11 (0x00007f8e1e0e3000) libgpg-error.so.0 => /usr/lib64/libgpg-error.so.0 (0x00007f8e1dede000) libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007f8e1dcc2000) libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00007f8e1da9a000) /lib64/ld-linux-x86-64.so.2 (0x00007f8e23074000) liblzma.so.5 => /usr/lib64/liblzma.so.5 (0x00007f8e1d874000) libidn.so.11 => /usr/lib64/libidn.so.11 (0x00007f8e1d641000) libssh2.so.1 => /var/home/lib/libssh2/lib/libssh2.so.1 (0x00007f8e1d414000) libssl3.so => /usr/lib64/libssl3.so (0x00007f8e1d1c2000) libsmime3.so => /usr/lib64/libsmime3.so (0x00007f8e1cf9b000) libnss3.so => /usr/lib64/libnss3.so (0x00007f8e1cc6e000) libnssutil3.so => /usr/lib64/libnssutil3.so (0x00007f8e1ca3e000) libplds4.so => /usr/lib64/libplds4.so (0x00007f8e1c83a000) libplc4.so => /usr/lib64/libplc4.so (0x00007f8e1c635000) libnspr4.so => /usr/lib64/libnspr4.so (0x00007f8e1c3f7000) libgssapi_krb5.so.2 => /usr/lib64/libgssapi_krb5.so.2 (0x00007f8e1c1aa000) libkrb5.so.3 => /usr/lib64/libkrb5.so.3 (0x00007f8e1bec1000) libk5crypto.so.3 => /usr/lib64/libk5crypto.so.3 (0x00007f8e1bc8e000) libcom_err.so.2 => /usr/lib64/libcom_err.so.2 (0x00007f8e1ba8a000) libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f8e1b783000) libgcc_s.so.1 => /usr/lib64/libgcc_s.so.1 (0x00007f8e1b56d000) libkrb5support.so.0 => /usr/lib64/libkrb5support.so.0 (0x00007f8e1b35d000) libXau.so.6 => /usr/lib64/libXau.so.6 (0x00007f8e1b159000) libkeyutils.so.1 => /usr/lib64/libkeyutils.so.1 (0x00007f8e1af55000) libselinux.so.1 => /usr/lib64/libselinux.so.1 (0x00007f8e1ad2e000) libpcre.so.1 => /usr/lib64/libpcre.so.1 (0x00007f8e1aacc000) よろしくお願い致します。
guest

回答1

0

ベストアンサー

libldap-2.4.so.2は、/var/home/lib/openldap/lib(自分でインストールした方)と/usr/lib64(OSに元々入っていた方)にあります。php実行においては、/var/home/lib/openldap/libが先に検索されて、/var/home/lib/openldap/libにあるlibldap-2.4.so.2がロードされるのでしょうか?

lddの出力結果に下のようにあるので、/var/home/lib/openldap/lib/が使われるはずです。

libldap-2.4.so.2 => /var/home/lib/openldap/lib/libldap-2.4.so.2 (0x00007f8e1f4c6000)

LD_LIBRARY_PATH の該当パスを消すと、/usr/lib64のものが使われるようになると思います。

投稿2019/05/07 09:28

otolab

総合スコア767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rx179mk5

2019/05/09 03:09

試しにLD_LIBRARY_PATHからlibldapへのパスを消してlddで確認したところ、自前でインストールしたlibldapとリンクしてました。なので、php(バイナリ)に含まれているrpathに列挙されているパスを左から順に検索していって、先に見つかった方とリンクしていると推察しています。
otolab

2019/05/09 03:34

https://docs.oracle.com/cd/E19205-01/820-1203/aeucy/index.html > リンカーは、いくつかの場所で、指定された順序でライブラリを検索します。検索の対象となるのは、標準のパスと、コンパイラオプション -Rpath、-llibrary、-Ldir で指定された場所、環境変数 LD_LIBRARY_PATH で設定されている場所です。 Linuxではないですが、基本的な挙動は同じはず。 http://tetsuyai.hatenablog.com/entry/20111201/1324792477 > 環境変数 LD_LIBRARY_PATHを使うと、そのディレクトリを一時的に共有ライブラリ検索パスに追加することができます。ただし再起動すると元に戻ってしまうため、永続的に追加したい場合は/etc/ld.so.confに記述します。 Linuxだとld.so.confが使える。 https://www.ecoop.net/memo/archives/2008-01-28-2.html > LD_PRELOAD を使うことでコンパイル時のロード順を入れ替えることができます。 LD_PRELOADが最優先っぽい。 あとはLD_LIBRARY_PATH_64など32 / 64bit混在のためのものもあるみたいですが、仕様の解説は調べていけばそこそこ見つかりそうですね。
rx179mk5

2019/05/14 10:45

ありがとうございます!参考にさせて頂きます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問