OUI-67200: "libserver10.a" is not a valid archive library Fatal error.-记一次OPatch报错

工程师在打OPatch补丁的时候遇到一个问题,打的时候Make失败。报如下错误:

Running make for target ioracle
Make failed to invoke "/usr/ccs/bin/make -f ins_rdbms.mk ioracle ORACLE_HOME=/u02/oracle/app/oracle/product/10.2.0/db"....'ld: The file "/u02/oracle/app/oracle/product/10.2.0/db/lib/libserver10.a" is not a valid archive library
Fatal error.

这里报错报的很明显,说libserver10.a文件不是一个有效的档案文件。那么.a文件到底是什么?.a文件其实就是多个.o文件的组合.既然它是.o文件的组合,那么可以证明.o文件要么缺失、要么损坏.说到这儿,我们的思路就是想办法验证.a文件中的.o文件是否齐全,是否有问题.我们可以检查我们opatch的log,我们可能会看到下列结果。

INFO:Running make for target ioracle
INFO:Start invoking 'make' at Mon Mar 17 12:29:26 MET 2008Mon Mar 17 12:29:26 MET 2008
INFO:Finish invoking 'make' at Mon Mar 17 12:29:38 MET 2008
WARNING:OUI-67200:Make failed to invoke "/usr/ccs/bin/make -f ins_rdbms.mk ioracle ORACLE_HOME=<path to $OH>"....'Undefined first referenced
symbol in file
kqldafl $ORACLE_HOME/lib//libserver10.a(kokt.o)
kqldaso $ORACLE_HOME/lib//libserver10.a(ktc.o)
kqlddep $ORACLE_HOME/lib//libserver10.a(kkt.o)
kqldlhn $ORACLE_HOME/lib//libserver10.a(kslt.o)
...
kqlPatchCharSetIdBootstrap $ORACLE_HOME/lib//libserver10.a(dbsdrv.o)
kqlCompareMetadata $ORACLE_HOME/lib//libserver10.a(kkzu.o)
ld: fatal: Symbol referencing errors. No output written to $ORACLE_HOME/rdbms/lib/oracle
make: Fatal error: Command failed for target `$ORACLE_HOME/rdbms/lib/oracle'
'
INFO:Stack Description: java.lang.RuntimeException: Undefined first referenced
symbol in file
kqldafl $ORACLE_HOME/lib//libserver10.a(kokt.o)
kqldaso $ORACLE_HOME/lib//libserver10.a(ktc.o)
kqlddep $ORACLE_HOME/lib//libserver10.a(kkt.o)

上述日志告诉我们,文件中的kqldafl可能有问题。这里我们可以使用看两个命令来查看,一个是symfind命令,一个是nm命令,这两个命令都能帮住我们检查该类问题。

[oracle@ora10g lib]$ cp libserver10.a /tmp/aaa/
[oracle@ora10g aaa]$ symfind kqldafl /tmp/aaa/libserver10.a
SymFind - Find Symbol <kqldafl> in <**>.a, .o, .so
------------------------------------------------------
Command:         /oracle/app/oracle/product/10.2.0/db_1/bin/symfind kqldafl /tmp/aaa/libserver10.a
Local Directory: /oracle/app/oracle/product/10.2.0/db_1
Output File:     (none)
Note:            I do not traverse symbolic links
Use '-v' option to show any symbolic links
Locating Archive and Object files ...
U kqldafl
U kqldafl
0000000000018868 T kqldafl
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /tmp/aaa/libserver10.a

这里我们用symfind检查了一下是否包含kqldafl,可以看到有三个对象文件.我们再用nm命令来查看.同样也能显示出和symfind一样的效果.

[oracle@ora10g aaa]$ nm libserver10.a |grep -i kqldafl
U kqldafl
U kqldafl
0000000000018868 T kqldafl

当然前面这都文件是正常的情况下,我们能看到正确的结果。如果文件是异常的情况下,我们就会看到下面的结果。

nm libserver10.a |grep -i kqldafl
nm: kql.o: Format error: shdr table truncated
[58] | 0| 0|FUNC |GLOB |0 |UNDEF |kqldafl
[445] | 0| 0|FUNC |GLOB |0 |UNDEF |kqldafl

最后我们再来介绍一下ar命令,ar命令会彻底的把我们的libserver10.a文件全部解开,我们将看到全部的.o文件。

[oracle@ora10g aaa]$ ar x libserver10.a
[oracle@ora10g aaa]$ ls -l |wc -l
1688


解开之后,我们可以使用objdump来查看.o文件中的一些信息。刚刚我们看到的是kqldafl它是在kokt.o文件中的,那么我们直接用objdump查看其信息。我们能看到文件中的函数名。例如kokt_gtyp()函数。

QQ20130620222552

解决方法:最终我这个问题是从其他相同环境的机器上拷贝了一个libserver10.a文件,重新执行打补丁成功!

参考文档:

Using Oracle Precompilers and the Oracle Call Interface

http://docs.oracle.com/html/A87435_01/ch4.htm

Make Of ioracle Fails For Interim Patch Due To Bad Unzip [ID 559667.1]

分享到: 更多

Post a Comment

Your email is never published nor shared. Required fields are marked *