libm.so.2: open に失敗しました

このQ&Aのポイント
  • Solaris10(SunStudio12.1)でビルドしたAPを、Solaris8で実行しようとしたら、下記のエラーが出て実行できません。
  • Solaris8のマシンの/usr/libには、libm.so.1はありますが、libm.so.2はありません。Solaris10のマシンには両方あります。
  • (2)Solaris8のマシンに存在するlibm.so.1で動作してくれないものかと思っています。
回答を見る
  • ベストアンサー

libm.so.2: open に失敗しました

教えて下さい。 Solaris10(SunStudio12.1)でビルドしたAPを、 Solaris8で実行しようとしたら、下記のエラーが出て実行できません。 「重大なエラー: libm.so.2: open に失敗しました: ファイルもディレクトリもありません。」 Solaris8のマシンの/usr/libには、libm.so.1はありますが、libm.so.2はありません。 Solaris10のマシンには両方あります。 (1)Solaris10でのビルド時に、libmをstaticリンクすることも考えたのですが、 OSに依存するライブラリだと思いますので、 (2)Solaris8のマシンに存在するlibm.so.1で動作してくれないものかと思っています。 (2)は可能でしょうか?どうすればできますでしょうか? そもそも動的リンクなのに、ビルド時にライブラリのバージョンは固定されてしまうものなのでしょうか? それぞれのマシンには /usr/lib/libm.so というシンボリックリンクがあり、 Solaris10ではlibm.so.2を、 Solaris8ではlibm.so.1を指しています。 バージョンに拘らずシンボリックリンク(libm.so)を使ってくれないものなのでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • entree
  • ベストアンサー率55% (405/735)
回答No.2

> やはりビルド時点でライブラリのバージョンは固定されてしまうものなのでしょうか? 固定されます。ライブラリのDT_NEEDEDに書き込まれているでしょう。 バイナリエディタなどで libm.so.2 という文字列が確認できるはずです。 どうしてもと言われるなら、バイナリエディタでその文字列を libm.so.1 に書き換えることです。 書き換えた後のバイナリは Solaris 10 では動作しないことに注意してください。 ただし、繰り返しますがライブラリのメジャーバージョンが違うと言うことは ライブラリの互換性がないことをベンダーが主張しているものです。 それは予期せぬ結果を招くリスクがあるということをご理解ください。 Solaris 10 の libm.so.2 を Solaris 8 にコピーするわけにも行かないでしょうから、 そのようなケースに出くわした場合、通常はlibm を静的リンクします。

kohmei1970
質問者

お礼

再度のアドバイス、有難うございます。 ビルド時点でライブラリのバージョンは固定されてしまうものなのですね。 分かりました。 Solaris10でlibmのstaticリンクを試みましたがダメでした。 libm.aが存在していません。 libmだけでなく、/usr/lib,/libにはstaticのライブラリは全くありません。 ご回答No.1に書いて頂いた、Solaris8マシンでの再リンクを試してみます。 ただ、Solaris8で現コンパイラ(CC5.5)が使えるサーバマシンは今回廃棄予定なので、、、 困りました、、、 なお、残す予定のSolaris8のクライアントマシン上で、 新サーバ(Solaris10)に入れてある新コンパイラ(CC5.10)を使って再リンクを試してみましたが、 /usr/include/sys/ccompile.hがない等のメッセージが出るなど、 さすがに全くダメのようです。 ご回答No.1に書いて頂いた、 「Solaris 8上で libm.so.2 -> libm.so.1 のシンボリックリンクを作成」は、 取り敢えず動きました。 有難うございました。

その他の回答 (1)

  • entree
  • ベストアンサー率55% (405/735)
回答No.1

Solaris 8上で libm.so.2 -> libm.so.1 のシンボリックリンクを作成すれば 動作させることができると思いますが、  # ln -s libm.so.1 /usr/lib/libm.so.2 ライブラリのメジャーバージョンが違うということは一般的には互換性が ないことを意味します。なので、安定動作を期待するなら Solaris 8 上で 再リンクする必要があります。

kohmei1970
質問者

お礼

ご回答、有難うございます。 ご提案下さったシンボリックリンク案もいいと思いました。 ただ、Solaris8のマシンはクライアントとして使っていて複数あるため、 できればクライアント側は変更しないで済ませたいです。 やはりビルド時点でライブラリのバージョンは固定されてしまうものなのでしょうか? なお、Solaris10のマシンはサーバで、このマシンでAPのビルドを行い、 NIS+ユーザのホームにAPプログラムを配置しています。 クライアントからNIS+ユーザのホームに置いてある APのクライアントプログラムを実行する構成を取っています。 今回、サーバマシンだけを Solaris8 から Solaris10 に更新しようとして、 この問題に突き当たっています。

関連するQ&A

  • libstdc++.so.5にパスが通らない

    Solaris8のコンソール上でC++でコーディングしたプログラムを実行したのですが、libstdc++.so.5が見つからないというエラーが出ます。 .cshrc内で setenv LD_LIBRARY_PATH /usr/local/lib とパスを設定してあるのですが…… なお、当然ながら/usr/local/libには該当するlibstdc++.so.5が存在しています。

  • png2jpeg・resize.pl

    png2jpegと、resize.plを使ってサムネイルを作成しようと考えています。 ファイルをアップロードするupload.cgiは作成し、画像をサーバーに転送することはできるのですが、 上の2つのファイルをどのように関連付ければ良いのかがわかりません。 check.cgiを見ると、 PerlMagick NG NetPBM + libjpeg-progs NG cjpeg -> /usr/bin/cjpeg djpeg -> /usr/bin/djpeg pngtopnm -> Not Found giftopnm -> Not Found pnmscale -> Not Found repng2jpeg(i386-linux) dynamic :OK standard:OK static :OK libjpeg -> /usr/lib/libjpeg.so.62 libpng -> /usr/lib/libpng.so.2 libz -> /usr/lib/libz.so.1 libm -> /lib/libm.so.6 libc -> /lib/libc.so.6 ldlinux -> /lib/ld-linux.so.2 ---------------------------------------- ./repng2jpeg Found SIZE : 59556 MD5 : 6f03c0ec0 ./repng2jpeg Permisson:OK ./repng2jpeg Exec:OK ->(repng2jpeg TestMode:OK version 1.0.4) $ldd ./repng2jpeg libpng.so.2 => /usr/lib/libpng.so.2 (0x00a36000) libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x002c2000) libc.so.6 => /lib/tls/libc.so.6 (0x005fe000) libm.so.6 => /lib/tls/libm.so.6 (0x00736000) /lib/ld-linux.so.2 (0x005e4000) ---------------------------------------- と表示され、使用可能な状態ではあると思います。 以上よろしくお願いします。

  • Expat.soが読めない!?

    XML::Parser 2.34 をインストールしました。 rootになれないレンタルサーバーですので、 ユーザーディレクトリ配下にインストールしました。 エラーは出ていません。 が、使用時に、 use XML::Parser; の行で下記エラーになります。 Can't load '/usr/home/USERNAME/perl/lib/i386-freebsd/auto/XML/Parser/Expat/Expat.so' for module XML::Parser::Expat: Shared object "libexpat.so.6" not found, required by "Expat.so" at /usr/…/DynaLoader.pm line 169. at /usr/home/USERNAME/perl/lib/i386-freebsd/XML/Parser.pm line 14 「DynaLoader.pm」は、システムのperlライブラリを参照してるようです。 もちろん-Iオプションで、 インストールしたライブラリパスを指定しています。 インストールは下記要領で、Expat-2.0.0からインストールしました。 <Expatのインストール> > ./configure --prefix=/usr/home/USERNAME/perl/lib > make > make install <XML::Parserのインストール> > perl Makefile.PL LIB=/usr/home/USERNAME/perl/lib EXPATLIBPATH=/usr/home/USERNAME/perl/lib/lib EXPATINCPATH=/usr/home/USERNAME/perl/lib/include INSTALLMAN1DIR=/usr/home/USERNAME/perl/lib/man1/ INSTALLMAN3DIR=/usr/home/USERNAME/perl/lib/man3/ > make > make install 気になるのが、Expatのconfigure実行後のMakefileで、  ifndef INSTALL_ROOT  INSTALL_ROOT=$(DESTDIR)  endif この部分がmake時にエラーになるのでコメントアウトしたことです。 INSTALL_ROOTは、--prefixで指定したディレクトリの前に付けて 使用しているので、無くて問題ないと判断したのですが…。 Expatのインストールに問題がある。というのは何となく分かるのですが、 どうすれば良いのかが分かりません。m(__)m perl 5.003です。

  • OpenSSLの共有ライブラリ(libcrypto.so)動的リンクにつきまして

    [環境] Linux version 2.6.9-67.EL gcc version 3.4.6 (Red Hat 3.4.6-8)) 以下のように、OpenSSLの共有ライブラリlibcrypto.soをロードする プログラムを書いているのですが、 ------ #include <stdio.h> #include <dlfcn.h> #include <errno.h> void main(void) { void* hSO; hSO = DLL_OPEN("/usr/local/ssl/lib/libcrypto.so", RTLD_NOW); if( hSO == NULL ) { printf("%s\n", dlerror()); } else { // 処理 } } ------ hSO = DLL_OPEN("/usr/local/ssl/lib/libcrypto.so", RTLD_NOW); で、NULLが返って来てしまいます。 [dlerror内容] /usr/local/ssl/lib/libcrypto.so: cannot open shared object file: No such file or directory しかし、このパスには、シンボリックリンクされたlibcrypto.soファイルが存在します。 試しに、同ディレクトリにあるlibcrypto.so.0.9.8mも試しましたが、同じエラーが出力されました。 パスの指定方法に、何か行う必要があるのでしょうか。

  • 共有ライブラリが見つからない

     お世話になります。  xxxxxというソフトウェアを動作させようとしたところ、下記のようなエラーメッセージが出ました。 > ld.so.1: xxxxx: fatal: libsasl.so: version `SUNWprivate1.1' not found (required by file /usr/lib/mps/libldap60.so) > ld.so.1: xxxxx: fatal: libsasl.so: open failed: No such file or directory > rc = 9 ■質問1  これは、 ・ld.so.1という共有モジュールが ・内部的にrequired by file /usr/lib/mps/libldap60.so というモジュールを呼んでいて ・それがlibsasl.soを呼ぼうとしたときに ・`SUNWprivate1.1'というバージョンのものがない というエラーだと解釈してよろしいでしょうか。 ■質問2  findでlibsasl.soを検索したところ、下記の場所にありました。 > /usr/lib/sparcv9/libsasl.so > /usr/lib/libsasl.so crleコマンドで共有ライブラリの検索パスを見てみたところ、/usr/libは含まれていました。 > @root# crle -v > > 構成ファイル [バージョン 4]: /var/ld/ld.config > デフォルトライブラリパス (ELF): /usr/lib:/usr/local/ssl/lib/:/usr/lib/mps > トラステッドディレクトリ (ELF): /usr/lib/secure:/opt/SUNWmsgsr/lib:/usr/lib/mps > > コマンド行: > crle -c /var/ld/ld.config \ > -l /usr/lib:/usr/local/ssl/lib/:/usr/lib/mps \ > -s /usr/lib/secure:/opt/SUNWmsgsr/lib:/usr/lib/mps  それでもエラーが出るのは ・このディレクトリにあるlibsasl.soが`SUNWprivate1.1'というバージョンではないから という解釈でよろしいでしょうか。 ■質問3 `SUNWprivate1.1'というバージョンのlibsasl.soを検索する方法があるでしょうか。  いろいろですみません。よろしくお願いいたします。

  • gccでの共有ライブラリのver指定

    表題の件に関して質問させていただきます。 たとえば/usr/libにある;libA.soをリンクしたい時、gccでは gcc -lA としますが、libA.so.1,libA.so.2‥と複数バージョンがある場合、バージョンまで指定してコンパイルすることは可能でしょうか? サーバー権限を持っていないので、シンボリックリンクを張り直すという手は使えません。 また、自分のアカウントで同共有ライブラリを用意したのですが、/usr/libが優先されてしまい、自分のアカウントのライブラリを設定することは出来ません。 解決法をご存知の方、ご教授お願い致します。

  • icu ビルドエラー

    いつもお世話になっております。 ICU(International Components for Unicode) http://www-01.ibm.com/software/globalization/icu/index.html を利用しようと、プログラムをビルドしたのですが、 library -lCrun: not found となりビルドできませんでした。 g++ -c -g -MMD -MP -MF build/Debug/GNU-Solaris-x86/main.o.d -o build/Debug/GNU-Solaris-x86/main.o main.cpp mkdir -p dist/Debug/GNU-Solaris-x86 g++ -o dist/Debug/GNU-Solaris-x86/icuapp2 build/Debug/GNU-Solaris-x86/main.o `/usr/bin/icu-config --ldflags` ld: fatal: library -lCrun: not found ld: fatal: file processing errors. No output written to dist/Debug/GNU-Solaris-x86/icuapp2 collect2: ld returned 1 exit status gmake[2]: *** [dist/Debug/GNU-Solaris-x86/icuapp2] エラー 1 gmake[2]: ディレクトリ `/home/a/NetBeansProjects/icuapp2' から出ます gmake[1]: *** [.build-conf] エラー 2 gmake[1]: ディレクトリ `/home/a/NetBeansProjects/icuapp2' から出ます gmake: *** [.build-impl] エラー 2 /usr/lib/libCrun.so.1 というファイルはあるのですが、何か不足があるのでしょうか。 どなたかご教授よろしくお願いいたします。

  • htpasswdコマンドで発生するエラーについて

    apache-2.0.58 をインストールし、basic認証を行おうと htpasswdコマンドを実行したところ、以下のエラーが発生しました。 「ld.so.1: htpasswd: 重大なエラー: libgcc_s.so.1: open に失敗しました: ファイルもディレクトリもありません。」 configのオプションは '--enable-layout=opt' '--enable-module=so' の二つで、apache本体は /opt/apache にインストールされています。 /opt/apache/lib/ には、/usr/local/lib/libgcc_s.so.1 へのシンボリックリンクが存在し、/usr/local/lib にlibgcc_s.so.1 の 実体も存在しています。 apacheは起動が出来、html,phpなどは動いています。 どうしてもBasic認証をしたいと思っており行き詰ってしまいました。。。 よろしくお願いいたします。 〔環境〕 OS:Solaris9 apache: httpd-2.0.58(ソースからコンパイル) gcc: gcc_small-3.4.2-sol9-sparc-local(パッケージ)

  • RedHatに関して、 .so ファイルとは?

    RedHatにあるソフトを入れて実行しようとしたところError:Cannot find /usr/local/soft/lib/tcltk_soft.soというエラーが出ます。。tcltk_soft.soというファイルはどこにも見当たりません。そもそも .so とはどのようなファイルなのでしょうか? Linuxは全くの素人です。 もし何かご存知であれば教えていただけると助かります。

  • PHP5インストール時にlibphp5.soが作成されない

    こんにちは。 CentOS3、Apache/2.0.46 の環境で、PHP5をインストールしようとしています。 VPSでレンタルしたもので、すでにPHP4が入っていたものを、PHP4.4.4にバージョンアップし使っていましたが、5を使いたいと思いインストールを試みたのですが、configure、makeが終わり、make installの段階で以下のようなエラーがでて終了していまいます。 ーーーーーーーー Installing PHP SAPI module: apache2handler /usr/lib/httpd/build/instdso.sh SH_LIBTOOL='/usr/bin/libtool' libphp5.la /usr/lib/httpd/modules /usr/bin/libtool --mode=install cp libphp5.la /usr/lib/httpd/modules/ cp .libs/libphp5.lai /usr/lib/httpd/modules/libphp5.la cp .libs/libphp5.a /usr/lib/httpd/modules/libphp5.a ranlib /usr/lib/httpd/modules/libphp5.a chmod 644 /usr/lib/httpd/modules/libphp5.a libtool: install: warning: remember to run `libtool --finish /etc/php-5/libs' Warning! dlname not found in /usr/lib/httpd/modules/libphp5.la. Assuming installing a .so rather than a libtool archive. chmod 755 /usr/lib/httpd/modules/libphp5.so chmod: failed to get attributes of `/usr/lib/httpd/modules/libphp5.so': No such file or directory apxs:Error: Command failed with rc=65536 . make: *** [install-sapi] Error 1 ---------------------------- configureは --with-apxs2=/usr/sbin/apxsのオプションだけで行い、とりあえずlibphp5.soファイルを作ろうとしているのですが、作成されません。 ネットをしらべたところ大抵のサイトでは--with-apxs2=/usr/sbin/apxsをだけつけてconfigureすれば生成される、と書かれていたのですが。。。。 よろしくお願いいたします、