• ベストアンサー

2つのマシンでコンパイルしたldd結果の違いを無くしたい

1台が SUNW Ultra-ENTERPRISE もう1台が SUNW,Ultra-30 で同じソース(mainのみのソースコード)をコンパイルし、lddコマンドを実行してみると SUNW,Ultra-30の方に /usr/platform/SUNW,Ultra-30/lib/libc_psr.so.1 というのが出てきてしまいます。 これを取り除きたいのですが、何をすれば良いのでしょう?

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

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

それは Solaris for SPARC の ldd の仕様なのか、実際にリンクされているのかは分かりませんが、いずれの場合にしても取り除くことはできません。 $ ldd /usr/lib/libc.so を実行してみれば分かるかと思います。libc にリンクされないプログラムは存在しないので、少なくとも、これに依存しているライブラリを ldd の結果から外すことはできません。

ari_els
質問者

お礼

了解しました。 とりあえず、この差は出てもしかたがないということになりました。 ありがとうございました。

その他の回答 (2)

回答No.2

ダイナミックリンクのエラーというか障害は見つけるのが難しいのですよね。 疑うのは2系間のシステムディレクトリのデータ差異や環境変数の差異でしょうか。 MakeのログについてDiffをとってみたらいかがでしょうか。リンクの所だけで十分だと思います。 間違っていたらご容赦

ari_els
質問者

お礼

とりあえず、この差は出てもしかたがないということになりました。 ありがとうございました。

回答No.1

static link すればいいんじゃないでしょうか。但し作られるバイナリはライブラリの一部を含むため少し大きくなります。 static link の指定方法はコンパイラによって違うと思います。(昔の Sun 純正の C コンパイラでは -static でした。gcc も -static のようです。他のコンパイラについては私は知りません)。

ari_els
質問者

お礼

アドバイスありがとうございます。 試しに本物のソースに対してstatic linkにしてやってみましたがコンパイルが通らなくなってしまいました。元々ダイナミックリンクをしているので、その辺に影響があるみたいです。なので、この方法は無理みたいです。 lddの結果で気になったのですが、 普通 AAA.so.1 => /usr/lib/AAA.so.1 と => かでると思うのですが、 /usr/platform/SUNW,Ultra-30/lib/libc_psr.so.1 は =>がありません。最後にこれが出てくるだけなのです。 こんな感じ。 >ldd test AAA.so.1 => /usr/lib/AAA.so.1 →出てきて正しいもの /usr/platform/SUNW,Ultra-30/lib/libc_psr.so.1 →何故か出てくる > どういう事なんでしょうかね・・・

関連するQ&A

  • GNU gettext が変なライブラリを参照している

    Solaris 2.7 に GNU gettext 0.14.5 をインストールしようとしています.gmake は通るのですが,出来上がった xgettext や msgfmt などのバイナリを ldd すると, .libs/libgettextsrc-0.14.5.so => .libs/libgettextsrc-0.14.5.so .libs/libgettextlib-0.14.5.so => (file not found) .libs/libintl.so.3.4.3 => (file not found) libiconv.so.2 => /usr/local/lib/libiconv.so.2 libc.so.1 => /usr/lib/libc.so.1 libexpat.so.0 => /usr/local/lib/libexpat.so.0 .libs/libgettextlib-0.14.5.so => (file not found) .libs/libintl.so.3.4.3 => (file not found) libdl.so.1 => /usr/lib/libdl.so.1 /usr/platform/SUNW,Ultra-4/lib/libc_psr.so.1 となり,どうやら一時ディレクトリである .libs 以下のライブラリを参照してしまっているようです.当然,gettext を用いて make した他のプログラムも動かなくなってしまうため,とても困っています. 試しに gettext 0.10.40 という古いものを入れてみたところ,問題は起こりませんでした. libintl.so.1 => /usr/local/lib/libintl.so.1 libiconv.so.2 => /usr/local/lib/libiconv.so.2 libc.so.1 => /usr/lib/libc.so.1 libdl.so.1 => /usr/lib/libdl.so.1 /usr/platform/SUNW,Ultra-4/lib/libc_psr.so.1 回避策等あれば教えていただきたいです. なお,gcc は 2.7.2.3 です.よろしくお願いいたします.

  • プログラム作成(コンパイル、リンク)でのコマンド

    プログラム素人です。 コンパイルオプション、あるいはコマンドなどいろいろとあり判らずにいます。 例えば、 $ gcc -fPIC -c xxx.c $ gcc -shared -Wl,-soname,libxxx.so.1 -o libxxx.so.1.0 xxx.o # cp libxxx.so.1.0 /usr/lib # /sbin/ldconfig /usr/lib # ln -s /usr/lib/libxxx.so.1 /usr/lib/libxxx.so とか $ ar rv libxxx.a xxx.o $ ranlib libxxx.a $ strip libxxx.a など(ほんの一部だと思いますが)これらのコマンドの意味役割など知りたいのですが、書籍などありますでしょうか。 ネット上で検索してみましたがキーワードが悪いのかよいサイトに出会えません。 皆様、よいアドレス、書籍あればご紹介下さい。

  • lddの見方について教えてください。

    必要なライブラリを表示しているのは分かったのですが=>の右側以上のバージョンのライブラリが必要という意味でしょうか?ということは=>となっているのは 存在していてOKということでしょうか? またnot foundとなったライブラリは一般的にどこでみつけて、どこに置けばいいでしょうか? [root@localhost DiCE]# ldd dice /lib/libNoVersion.so.1 (0x00b37000) libqtintf.so => not found libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x0081b000) libpthread.so.0 => /lib/libpthread.so.0 (0x00a77000) libdl.so.2 => /lib/libdl.so.2 (0x00815000) libc.so.6 => /lib/libc.so.6 (0x00d1c000) /lib/ld-linux.so.2 (0x006ab000)

  • 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) ---------------------------------------- と表示され、使用可能な状態ではあると思います。 以上よろしくお願いします。

  • 共有ライブラリ作成時の -L

    sub1.c sub2.cからlibsub1.so libsub2.soを作成し、main.cをコンパイルします。 いずれのファイルも/rootにあります。 ここで gcc -c sub1.c gcc -shared -o libsub1.so sub1.o gcc -c sub2.c gcc -shared -o libsub2.so sub2.o gcc -o main main.c libsub1.so  libsub2.so だけでは [root@localhost ~]# ldd main linux-gate.so.1 => (0x0020d000) libsub1.so.1 => not found libsub2.so.1 => not found libc.so.6 => /lib/libc.so.6 (0x003e3000) /lib/ld-linux.so.2 (0x003c4000) でロードされていないので ln -s /root/libsub1.so /usr/lib/libsub1.so ln -s /root/libsub2.so /usr/lib/libsub2.so で/usr/libにシンボリックリンクを張る必要があります。 このリンクをはる作業をなんとかしてコンパイラのオプションを用いて省略したいとおもっています。 そこで gcc -o main main.c -L/root/libsub1.so -L/root/libsub2.so としたのですが /tmp/cc4Ccfom.o: In function `main': main.c:(.text+0x12): undefined reference to `print' collect2: ld はステータス 1 で終了しました make: *** [main] エラー 1 になってしまいました。 上の状況で質問は2つあります。 (1)gccのオプションを用いてシンボリックリンクを張る作業を省略するにはどうすればいいでしょうか?(私はーLの使い方を見よう見まねで用いたのですがまずかったようでエラーがでました。) (2)上のエラーは何が原因だったのでしょうか? ソースは //sub1.c #include "sub.h" int TEST=10; //sub2.c #include "sub.h" #include <stdio.h> void print(void) { if(TEST) printf("TEST is HOGE!\n"); } //main.c #include "sub.h" #include <stdio.h> int main(void) { print(); return 0; } //sub.h extern int TEST; です。 どちらかでも回答できるかたがいらっしゃれば、お願いします。

  • mrtgのインストールについて

    いつもお世話になっています。(初心者です。) OS:Solaris10 Generic_120011-14 sun4u sparc SUNW,Ultra-5_10 上記の物を使用してmrtgをインストールと設定をしている所です。 net-snmpはサイト上調べながらインストールと設定は済みです。 mrtgをインストールしようとコンパイルし、gmakeコマンドを実行した所下記のエラーが出て困っています。ご教授頂ければ幸いです。 gmakeのコマンド gmake: *** No targets specified and no makefile found. Stop. コンパイル時のコマンドは ./configure \ --with-gd-lib=/opt/sfw/lib \ --with-gd-inc=/opt/sfw/include \ --with-z-lib=/usr/local/lib \ --with-z-inc=/usr/local/include \ --with-png-lib=/usr/local/lib \ --with-png-inc=/usr/local/include 以上、よろしくお願いします。

  • CentOs5.8Apacheのリビルド

    CentOS5.8でSNIを使おうと思っています。 そのためのOpenSSL1.0.1eはインストールできました そのOpensslをApacheに適用させるために既存のApacheのリビルドをしたいと思っています ですが、現在のApacheの設定をそのままにリビルドする方法はありますか? 現在1日はまってしまい、非常に困っています。 下記OpenSSLの更新作業 ===================================================== # wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz # tar zxvf openssl-1.0.1e.tar.gz # cd openssl-1.0.1e # ./config enable-tlsext -fPIC shared # make # make test # make install ※デフォルト/usr/local/ssl/にインストールされるみたいです。 ・まずはパスを認識させます # echo /usr/local/ssl/lib > /etc/ld.so.conf.d/openssl.conf # ldconfig ・既存のopensslの実行ファイルを今回インストールした物と変更します。 # cd /usr/bin # mv openssl openssl.old # ln -s /usr/local/ssl/bin/openssl ・シェアードライブラリが正しくリンクできているか確認 # ldd /usr/local/ssl/bin/openssl linux-vdso.so.1 => (0x00007fff49bf2000) libssl.so.1.0.0 => /usr/local/ssl/lib/libssl.so.1.0.0 (0x00002b5327442000) libcrypto.so.1.0.0 => /usr/local/ssl/lib/libcrypto.so.1.0.0 (0x00002b53276a7000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003f36000000) libc.so.6 => /lib64/libc.so.6 (0x0000003f35400000) /lib64/ld-linux-x86-64.so.2 (0x0000003f34c00000) =================================================================================== 宜しくお願い致します。

  • rmicが通りません(初心者です)

    下のURLのHelloWorld.javaとHelloWorldObj.javaをコピペしてコンパイルしようとしたのですがrmicでエラーがでます。何が悪いのか分からず困っています。どうか教えて下さい。osはlinuxでjavaはjdk1.5.0_07です。 http://www.hellohiro.com/rmi.htm $ rmic HelloWorldObj java.lang.NullPointerException at 0x40268de4: java.lang.Throwable.Throwable() (/usr/lib/./libgcj.so.3) at 0x4025bcaf: java.lang.Exception.Exception() (/usr/lib/./libgcj.so.3) at 0x4025f56f: java.lang.RuntimeException.RuntimeException() (/usr/lib/./libgcj.so.3) at 0x4025ec67: java.lang.NullPointerException.NullPointerException() (/usr/lib/./libgcj.so.3) at 0x4021b627: _Jv_ThrowNullPointerException (/usr/lib/./libgcj.so.3) at 0x403202cb: ?? (??:0) at 0x4031c817: gnu.java.rmi.rmic.RMIC.generateStub() (/usr/lib/./libgcj.so.3) at 0x4031b6ed: gnu.java.rmi.rmic.RMIC.processClass(java.lang.String) (/usr/lib/./libgcj.so.3) at 0x4031b644: gnu.java.rmi.rmic.RMIC.run() (/usr/lib/./libgcj.so.3) at 0x4031b507: gnu.java.rmi.rmic.RMIC.main(java.lang.String[]) (/usr/lib/./libgcj.so.3) at 0x40242dd8: gnu.gcj.runtime.FirstThread.call_main() (/usr/lib/./libgcj.so.3) at 0x402ad02d: gnu.gcj.runtime.FirstThread.run() (/usr/lib/./libgcj.so.3) at 0x4024fc4c: _Jv_ThreadRun(java.lang.Thread) (/usr/lib/./libgcj.so.3) at 0x4021c8ac: _Jv_RunMain(java.lang.Class, byte const, int, byte const, boolean) (/usr/lib/./libgcj.so.3) at 0x4021c9cd: JvRunMain (/usr/lib/./libgcj.so.3) at 0x080485a8: ?? (??:0) at 0x42015704: __libc_start_main (/lib/tls/libc.so.6) at 0x080484f5: ?? (??:0)

    • ベストアンサー
    • Java
  • 32bitでコンパイルするには

    お世話になっております。 CentOSの64ビットマシンを使っています。 C言語の簡単なサンプルとして、ポインタ変数の長さを表示するプログラム(sizeof(ポンタ変数)をprintf)を作りました。 これをコンパイルして実行すると8と表示されますので、64bitとアプリケーションとしてコンパイルされたのだろうと思います。 次に32Bitアプリケーションとしてコンパイルするために-m32オプションを付けてコンパイルしたところ、以下のとおりエラーが出てしまい困っております。 gcc -m32 -o sample sample.c /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s /usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-redhat-linux/4.4.7/libgcc_s.so when searching for -lgcc_s /usr/bin/ld: cannot find -lgcc_s collect2: ld returned 1 exit status 解決方法について教えていただければ幸いです。 コンパイラは、gcc-4.4.7-3.el6.x86_64をインストールしています。 よろしくお願いします。

  • ubuntuでのコンパイル

    Linux超初心者です。 今回困っていることはubutuでコンパイルができないことです。 ubuntuのバージョンは7.10 Gutsy Gibbonです。 教えてgooでも何個かそれに関する質問があったのですがそれを行ってもだめでした。 まず、ubuntuには開発環境が入っていないということでbuild-essentialをインストールしようとおもいました。 $ sudo apt-get install build-essential と入力したところ E: ロック /var/lib/dpkg/lock が取得できませんでした - open (11 Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? と返ってきてインストールできませんでした。 一応GUI画面でもやっとこうと思いでやりましたがSynapticに検索にすら引っかからず。。。 それで今度はubuntuに関するサイトからbuild-essentialのインストーラーをミラーサイトからダウンロードしてインストールを行ったのですが Error:Dependency is not satisfible: libc6-dev|libc-dev というエラーメッセージがでてまた無理でした。 それでそのエラーメッセージにあるlibc6-devをインストールしないといけないのかと思い。これも行ってみました。 ~$ sudo apt-get install libc E: ロック /var/lib/dpkg/lock が取得できませんでした - open (11 Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? とまた同じエラー $ sudo apt-get install libc6 E: ロック /var/lib/dpkg/lock が取得できませんでした - open (11 Resource temporarily unavailable) E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? こちらも同じエラー。 よくわからないですがwhichというコマンドもためしておきました。 ~$ which gcc /usr/bin/gcc ディレクトリ指定されるって事はコンパイラ入ってるのかと思い、試しにhello worldをコンパイルしてみましたが、 $ gcc hello.c hello.c:6:19: error: stdio.h: No such file or directory hello.c: In function ‘main’: hello.c:10: 警告: incompatible implicit declaration of built-in function ‘printf’ だめでした。 書いてる情報が少なかったらごめんなさい。 とりあえず困っているのでよろしくお願いします。

専門家に質問してみよう