5

アプリケーションの実行中にメッセージが表示される

java: symbol lookup error: /usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so: undefined symbol: SQLAllocEnv

アプリケーションの目的は、Pentaho ケトル jar ファイルを使用して、あるサーバーから別のサーバーにデータを移行することです。宛先サーバーで Jdbc-Odbc 接続を使用しています。最近、オラクルの Web サイトから Java (jre および jdk) をインストールしました。私が設定したとき

export LD_DEBUG=all

次の応答が表示されます

binding file /usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so [0] to /lib64/libc.so.6 [0]: normal symbol `__cxa_finalize' [GLIBC_2.2.5]
      5193:
      5193:     calling init: /usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so
      5193:
      5193:     opening file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so [0]; direct_opencount=1
      5193:
      5193:     symbol=JNI_OnLoad;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so [0]
      5193:     symbol=JNI_OnLoad;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libjava.so [0]
      5193:     binding file /usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so [0] to /usr/java/jdk1.7.0_09/jre/lib/amd64/libjava.so [0]: normal symbol `JNI_OnLoad'
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libjava.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/server/libjvm.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libverify.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libdl.so.2 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libc.so.6 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libm.so.6 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libpthread.so.0 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
      5193:     /usr/java/jdk1.7.0_09/jre/lib/amd64/libjava.so: error: symbol lookup error: undefined symbol: Java_sun_jdbc_odbc_JdbcOdbc_allocEnv (fatal)
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libzip.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/server/libjvm.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libjava.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libc.so.6 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libm.so.6 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libdl.so.2 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libpthread.so.0 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libverify.so [0]
      5193:     /usr/java/jdk1.7.0_09/jre/lib/amd64/libzip.so: error: symbol lookup error: undefined symbol: Java_sun_jdbc_odbc_JdbcOdbc_allocEnv (fatal)
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libnio.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libjava.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libnet.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libpthread.so.0 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libdl.so.2 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libc.so.6 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/server/libjvm.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libverify.so [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/lib64/libm.so.6 [0]
      5193:     /usr/java/jdk1.7.0_09/jre/lib/amd64/libnio.so: error: symbol lookup error: undefined symbol: Java_sun_jdbc_odbc_JdbcOdbc_allocEnv (fatal)
      5193:     symbol=Java_sun_jdbc_odbc_JdbcOdbc_allocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so [0]
      5193:     binding file /usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so [0] to /usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so [0]: normal symbol `Java_sun_jdbc_odbc_JdbcOdbc_allocEnv'
      5193:     symbol=SQLAllocEnv;  lookup in file=java [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/libpthread.so.0 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/usr/java/jdk1.7.0_09/bin/../jre/lib/amd64/jli/libjli.so [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/libdl.so.2 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/libc.so.6 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/server/libjvm.so [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/libm.so.6 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libjava.so [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/server/libjvm.so [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/libc.so.6 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/usr/java/jdk1.7.0_09/jre/lib/amd64/libverify.so [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/libdl.so.2 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/libm.so.6 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/libpthread.so.0 [0]
      5193:     symbol=SQLAllocEnv;  lookup in file=/lib64/ld-linux-x86-64.so.2 [0]
      5193:     /usr/java/jdk1.7.0_09/jre/lib/amd64/libJdbcOdbc.so: error: symbol lookup error: undefined symbol: SQLAllocEnv (fatal)

これらの関数の実装がlibodbc.so(libodbc.so.2.0.0へのシンボリックリンク)に存在することは明らかです。

nm -a /usr/local/lib/libodbc.so | grep "SQLAllocEnv"
0000000000006f30 T SQLAllocEnv
0000000000000000 a SQLAllocEnv.c

LD_LIBRARY_PATH に /usr/local/lib があります (エクスポートしました)。また、新しい構成ファイルを /etc/ld.so.conf.d に置き、ldconfig を実行しました。しかし、何らかの理由で、この関数 (およびおそらく他の関数) がロードされません。

また

ldd /usr/java/latest/jre/lib/amd64/libJdbcOdbc.so
        linux-vdso.so.1 =>  (0x00007fff09728000)
        libjava.so => /usr/java/latest/jre/lib/amd64/libjava.so (0x00007fb8d03ab000)
        libjvm.so => not found
        libc.so.6 => /lib64/libc.so.6 (0x00007fb8d000d000)
        libjvm.so => not found
        libverify.so => /usr/java/latest/jre/lib/amd64/libverify.so (0x00007fb8cfdfe000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fb8cfbfa000)
        /lib64/ld-linux-x86-64.so.2 (0x000000368b000000)
        libjvm.so => not found

誰でもこれを修正する方法について何か提案をしてもらえますか? 私の理解では、リンカーが呼び出しを動的に解決している場合、LD_LIBRARY_PATH を使用して elf ファイルを検索します。これは正しいです?必要な機能を備えた共有ライブラリを見つけるために構築されるある種のインデックスはありますか? ld.so.cache が作成されることは認識していますが、SQLAllocEnv -> x.so、libodbc.so などのインデックスが必要です。リンカーがこれらの特定のファイルでシンボルを検索するのはなぜですか?

ありがとう

4

1 に答える 1

0

このエラーは、デフォルトの場所にいくつかのライブラリ ファイルが見つからないことを意味します。あなたの場合、 export LD_LIBRARY_PATH=/usr/java/latest/jre/lib/amd64 のようにこれをエクスポートできます。そして、それは問題を解決するはずです。

于 2014-05-15T16:33:49.627 に答える