fatal: ... wrong ELF class: ELFCLASS64

    今天有人在用Solaris上的ociuldr时遇到这个问题, 引起这个问题的原因是, ociuldr是编译成32Bit的程序的, 因此需要使用32Bit的Oracle客户端库, 在8i中, $ORACLE_HOME/lib是32Bit的库文件所在目录, $ORACLE_HOME/lib64是64Bit的库所在的目录, 而9i以后, $ORACLE_HOME/lib32是32Bit的库文件, $ORACLE_HOME/lib是64Bit的库文件, 一般在Oracle 9i及以上版本的服务器端, 默认的库文件查找位置(Linux/Unix: LD_LIBRARY_PATH变量, AIX: LIBPATH变量)是指向64Bit的客户端的, 这时运行ociuldr就报了这个错误.

    我一般是将可行文件命名成ociuldr.bin, 然后建一个ociuldr的Shell角本, 如下所示:

#!/bin/sh

if [ "A${ORACLE_HOME}A" = "AA" ]; then
   echo "ORACLE_HOME environment variable not setted."
   exit
fi

if [ "A${LD_LIBRARY_PATH}A" = "AA" ];then
   LD_LIBRARY_PATH=/lib:/usr/lib
fi

if [ -d ${ORACLE_HOME}/lib32 ]; then
   LD_LIBRARY_PATH = ${ORACLE_HOME}/lib32:${ORACLE_HOME}/lib:${LD_LIBRARY_PATH}
else
   LD_LIBRARY_PATH = ${ORACLE_HOME}/lib:${ORACLE_HOME}/lib64:${LD_LIBRARY_PATH}
fi

export LD_LIBRARY_PATH

ociuldr.bin "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$8"

    这个程序在8i/9i/10g的客户端下都可以跑, 不需要重新编译. 我的其他工具也都是32Bit的, 可以使用相同的办法处理.

发表留言: