工程师在打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()函数。
解决方法:最终我这个问题是从其他相同环境的机器上拷贝了一个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