• 締切済み

共有ライブラリロードエラー(_Znwj)

LINUXのGCCで,共有ライブラリを作成しようとしています。 ライブラリとして提供する関数の中で,エリアを new しているものがあるのですが,こうして作成したライブラリ(mytest.so.1.0)をアプリケーションから dlopen() で開こうとすると,  Error of dlopen() : ./mytest.so.1.0: undefined symbol: _Znwj となってしまいます。 この _Znwj というのがよくわからないのですが,nmコマンドでmytest.so.1.0 の情報を表示してみると,     :  00001e18 A _DYNAMIC  00001dcc A _GLOBAL_OFFSET_TABLE_   U _Znwj  00001dc0 ? __CTOR_END__  00001dbc ? __CTOR_LIST__     : となっており,確かに“未定義”として _Znwj というのが表示されます。 共有ライブラリの中で new を使用する場合は,なにか注意点などあるのでしょうか。 たとえば,コンパイルオプションでなにかを指定するとか・・ C/C++系の質問コーナーに発言するほうが良いのかもしれませんが,LINUX特有のことなので,こちらに質問しました。 ご存知の方,教えてください。

みんなの回答

  • inetd
  • ベストアンサー率23% (43/184)
回答No.1

_Znwj は /usr/lib/libstdc++.so.3 の中にあると思いますが、どうでしょう? そっちを先に開いておけば良いように思いますが。

関連するQ&A

  • Linux C言語共有ライブラリを作成するときの

    RedHatLinux7.3(2.96-110)、gcc(2.96 20000731)です。 C言語で共有ライブラリを作成しています。このライブラリは呼び出し側のプログラム起動時にロードされるものなのですが、以下の2つの手順で生成されたライブラリは、どのような違いがあるのでしょうか? どちらも呼び出し側からは関数コールで実行できるのですが、どちらが正しいのでしょうか? 【その1】 1) gcc -shared -o libxxx.so xxx.c (ライブラリ生成) 2) gcc ./libxxx.so -o testcall testcall.c (呼び出し側とライブラリをリンクして実行ファイル生成) 【その2】 1) gcc -fPIC -c libxxx.c(ライブラリのオブジェクト生成) 2) gcc -fPIC -c -shared -Wl,-soname,libxxx.so.0 -o libxxx.so.0.0 xxx.o(共有ライブラリ生成) 3) soname設定 4) linkername設定 5) gcc -c -o testcall.o testcall.c(呼び出し側オブジェクト生成) 6) gcc -o testcall testcall.o -lxxx 7) LD_LIBRARY_PATH設定、exportする 以上、ご存知のかた、どうぞよろしくお願いします。

  • Makefileと共有ライブラリ

    main.c sub1.c sub2.cに対して 共有ライブラリlibsub1.soとlibsub2.soを生成して それをもちいてmainをコンパイルするMakefileを以下のように記述しました。 CC=gcc LIB= CFLAGS=-Wall TARGET = main SHAD = -shared .SUFFIXES:.so .o SRCS = main.c libsub1.so libsub2.so $(TARGET):$(SRCS) $(CC) -o $@ $(SRCS) @echo "make finished!!" #.o.so: # $(CC) $(SHAD) -o $@ $< libsub1.so:sub1.o gcc -shared -o libsub1.so sub1.o libsub2.so:sub2.o gcc -shared -o libsub2.so sub2.o .c.o: $(CC) -c $< #sub1.o:sub1.c # gcc -c -fPIC sub1.c #sub2.o:sub2.c # gcc -c -fPIC sub2.c clean: @rm -f libsub?.so sub?.o ここで.oから.cを生成するのはサフィックスでできたのですが、同じように.oから.soを生成するのは できませんでした。 #.o.so: # $(CC) $(SHAD) -o $@ $< ここはどのように記述したらいいのでしょうか? 回答お願いします。

  • 共有ライブラリ作成時の -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; です。 どちらかでも回答できるかたがいらっしゃれば、お願いします。

  • 共有ライブラリの作成について

    呼び出した関数名の名前を表示させる、 テスト用共有ライブラリ「testLib.so」を作成しようと思っています。 そしてそのライブラリを他のプログラムから呼び出すというものです。 以下、内容。 int test1(void){ printf("test1 program."); } int test2(void){ printf("test2 program."); } int test3(void){ printf("test3 program."); } 【パターン1】 上記関数毎でファイル分けし、 test1.c、test2.c、test3.c と言うファイルを作成。 これらの各オブジェクトを取り込んで共有ライブラリを作成するパターン。 【パターン2】 全ての関数を「testDisp.c」と言うファイルに記述し、 このオブジェクトファイルで共有ライブラリを作成するパターン。 上記パターン1と2では用途によって使い分け方法があると言う話を先日聞いたのですが、どの様な場合に1、どの様な場合に2のパターンを使用するのでしょうか。 宜しくお願い致します。

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

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

  • 共有ライブラリのシンボル削除

    とてもセキュリティを深く考えなければならない共有ライブラリ(.so)を作成しています。 作成したライブラリからシンボルを完全に削除したいのですが,例えば,mylib.so というライブラリ名だとすると $ strip mylib.so とすれば,nmコマンドではシンボルは表示されなくなりました。 しかし,バイナリエディタで mylib.so を開くと,エクスポートするつもりのない内部関数まで,見えてしまっています。 バイナリエディタで開かれても,関数名を見えなくする方法はありますでしょうか。 ご存知の方,ご教授ください。

  • 動的ライブラリ中のグローバル変数

    以下の3行を前提条件とします。 メインのプログラムmainと動的ライブラリsub1.soとsub2.soがあります。 sub1.cとsub2.cにはsub.hというヘッダをインクルードしています。 mainはsub1.soおよびsub2.soを実行時に動的にリンクします。 ここでsub1.c中で int TEST=10;と変数を定義しました。 さらにsub.h中にextern int TEST;と変数を宣言しました。 そしてsub2.h中で if(TEST){…}と記述しました。 この状態でコンパイルを実行しました。 ここでmainを実行すると動きません。 調べてみるとsub2.soがTESTがundefined symbolとなっていました。 動的ライブラリ間での変数の共有の仕方は上の書き方では不正確なのでしょうか?

  • Linuxの動的ライブラリをMacで使いたい

    64bit Linux用に提供されたライブラリ(*.a, *.so)をMac(Snow Leopard)で使いたいと思っています。Mac環境でコンパイルをしたところ、リンク時に以下のwarningが出てしまいました。 ld: warning: in xxx.so, file is not of required architecture Webで調査し、gccのオプションに-arch i386 -arch x86_64を付けてみましたが解決できませんでした。そもそも、Linux用のライブラリをMacで使うというのは無理なのでしょうか?ご回答どうぞよろしく御願いいたします。

  • JNIでロードするライブラリが見つからない

    JNIを使ってライブラリを呼び出すとき, Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path というようにライブラリが見つからないエラーが出て困っています. 【Javaのコード】 [*****@**** jnitest]$ vi HelloWorldJNI.java public class HelloWorldJNI { static { System.loadLibrary("HelloWorldJNIlib"); } public native void sayHelloWorld(); public static void main(String[] args) { HelloWorldJNI hello = new HelloWorldJNI(); hello.sayHelloWorld(); } } 【Cのコード】 [*****@**** jnitest]$ vi HelloWorldJNI.c #include "HelloWorldJNI.h" JNIEXPORT void JNICALL Java_HelloWorldJNI_sayHelloWorld (JNIEnv *env, jobject obj ) { printf("Hello World"); } 【手順】 [*****@**** jnitest]$ javac HelloWorldJNI.java [*****@**** jnitest]$ ls HelloWorldJNI.c HelloWorldJNI.class HelloWorldJNI.java [*****@**** jnitest]$ javah HelloWorldJNI [*****@**** jnitest]$ ls HelloWorldJNI.c HelloWorldJNI.class HelloWorldJNI.h HelloWorldJNI.java [*****@**** jnitest]$ gcc -fPIC -shared -I/usr/lib/jvm/java-1.6.0/include/ -I/usr/ lib/jvm/java-1.6.0/include/linux/ HelloWorldJNI.c -o HelloWorldJNIlib.so [*****@**** jnitest]$ ls HelloWorldJNI.c HelloWorldJNI.h HelloWorldJNIlib.so HelloWorldJNI.class HelloWorldJNI.java [*****@**** jnitest]$ export LD_LIBRARY_PATH=. [*****@**** jnitest]$ java HelloWorldJNI Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1698) at java.lang.Runtime.loadLibrary0(Runtime.java:840) at java.lang.System.loadLibrary(System.java:1047) at HelloWorldJNI.<clinit>(HelloWorldJNI.java:3) [*****@**** jnitest]$ java -Djava.library.path=. HelloWorldJNI Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloWorldJNIlib in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1698) at java.lang.Runtime.loadLibrary0(Runtime.java:840) at java.lang.System.loadLibrary(System.java:1047) at HelloWorldJNI.<clinit>(HelloWorldJNI.java:3) [*****@**** jnitest]$ 何を見直すべきかおわかりの方いらっしゃいませんでしょうか.

    • ベストアンサー
    • Java
  • 静的ライブラリから静的ライブラリを生成する方法

    初めて質問させていただきます。 複数の静的リンクライブラリをまとめて、 一つの静的リンクライブラリを作成できずに困っています。 以下の様な構造のディレクトリがあります。 MAINDIR ├SUBDIR_A ├SUBDIR_B └SUBDIR_C まず、それぞれのサブディレクトリ(SUBDIR_A, SUBDIR_B, SUBDIR_C) で、個別に静的ライブラリ(SUB_A.a, SUB_B.a, SUB_C.a)を 作成しました。コマンドはgccでコンパイル後に"ar rv" です。 最後にMAINDIRで、各サブディレクトリで作った静的ライブラリ (SUB_A.a, SUB_B.a, SUB_C.a)から一つの静的ライブラリ(MAINLIB.a) を以下のコマンドで作りました。 ar rv MAINLIB.a SUB_A.a, SUB_B.a, SUB_C.a しかし、作成したMAINLIB.aから実行ファイルを作ろうとすると、 "ould not read symbols: Archive has no index; run ranlib to add" というエラーメッセージが出て失敗しました。 複数の静的ライブラリをまとめた一つの共有ライブラリを作れたので、 複数静的ライブラリ→1つの静的ライブラリも作れると思ったのですが。。。 御存知の方がいらっしゃいましたら、お助けください。お願いします。