opensslコマンドが -lcrypto.0.9.8 を見つけられない▼

% ldd /usr/ssl/bin/openssl
/usr/ssl/bin/openssl:
         -lcrypto.0.9.8 => not found
         -lssl.0.9.8 => /usr/ssl/lib/libssl.so.0.9.8
         -lcrypto.0.9.8 => /usr/ssl/lib/libcrypto.so.0.9.8
         -lc.12 => /usr/lib/libc.so.12

$Id$


すべての環境やOSで起きるわけではありません。 (NetBSD-1.6では起きます)

上記問題が出る環境では、ldd libssl.so すると同じエラーが出ます。

$ ldd /usr/ssl/lib/libssl.so
/usr/ssl/lib/libssl.so:
         -lcrypto.0.9.8 => not found


▼解決法

共有ライブラリに対しても RPATH を埋め込むよう、Makefileにパッチをあてます。


openssl-0.9.8za-rpath.patch: If you do not want the patch, build with `make SHARED_LDFLAGS=-Wl,-rpath,/usr/ssl/lib` diff -6 -ur openssl-0.9.8b-orig/Makefile.shared openssl-0.9.8b/Makefile.shared --- openssl-0.9.8b-orig/Makefile.shared Sat Dec 17 05:52:38 2005 +++ openssl-0.9.8b/Makefile.shared Thu Aug 31 17:25:14 2006 @@ -148,13 +148,13 @@ DO_GNU_SO=$(CALC_VERSIONS); \ SHLIB=lib$(LIBNAME).so; \ SHLIB_SUFFIX=; \ ALLSYMSFLAGS='-Wl,--whole-archive'; \ NOALLSYMSFLAGS='-Wl,--no-whole-archive'; \ - SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX" + SHAREDFLAGS="$(CFLAGS) $(SHARED_LDFLAGS) -shared -Wl,-Bsymbolic -Wl,-soname=$$SHLIB$$SHLIB_SOVER$$SHLIB_SUFFIX -Wl,-rpath,$(LIBRPATH)" DO_GNU_APP=LDFLAGS="$(CFLAGS) -Wl,-rpath,$(LIBRPATH)" #This is rather special. It's a special target with which one can link #applications without bothering with any features that have anything to #do with shared libraries, for example when linking against static

当パッチは OpenSSL 開発陣にも 送りましたが、 「共有ライブラリにRPATHを設定するのはオプション機能であるべき」 との理由で却下されました。


▽付録:RPATHの確認方法

OSによって違う のですが、 GNU binutils なら objdump -p ファイル | grep RPATH で拾えます。

% objdump -p /usr/ssl/sbin/sshd

/usr/ssl/sbin/sshd:     file format elf32-i386

Program Header:
    PHDR off    0x00000034 vaddr 0x08048034 paddr 0x08048034 align 2**2
         filesz 0x000000c0 memsz 0x000000c0 flags r-x
...

Dynamic Section:
  NEEDED      libcrypt.so.0
  NEEDED      libcrypto.so.0.9.8
  NEEDED      libutil.so.6
  NEEDED      libz.so.0
  NEEDED      libc.so.12
  RPATH       /usr/ssl/lib		これ
  INIT        0x804af8c
  FINI        0x8076554
....

かべ@sra-tohoku.co.jp