2

HP から AIX へのアプリケーションの移行の一環として、固有の問題に直面しています。次のシミュレートされたコードは、HP と AIX で異なる結果を生成します。

library.C **

    #include <stdio.h>
    #include "mylib.h"

    int libimgclientFNXXX()
    {
       int check = 100;
       check = FileNetDeleteDoc(check);
       return check;
    }

    int libimgclientFN()
    {
       int check = 1;
       printf("In lib ");
       return check;
    }

* main_func.C *

    #include <stdio.h>

    int libimgclientFN();
    int libimgclientFNXXX();

    int main()
    {
       int one = 0;
       if (1 == 1)
       {
            one = libimgclientFN();
       }
       printf("\n The status is %d \n", one);
    }

* mylib.h **

    extern int FileNetDeleteDoc (int);

関数 libimgclientFNXXX() は呼び出されないことに注意してください。私のメイクファイルは次のとおりです。

xlC -c -g library.C -o library.o -I./
xlC -G -qmkshrobj  -o  libImgClient.so library.o
xlC -c -g  -qpic=small main_func.C -o main_func.o
xlC -brtl main_func.o -L. -lImgClient -o TST

TST を実行すると、次の読み込みエラーが発生します。

$ TST
exec(): 0509-036 Cannot load program TST because of the following errors:
rtld: 0712-001 Symbol FileNetDeleteDoc__Fi was referenced
      from module ./libImgClient.so(), but a runtime definition
      of the symbol was not found.

関数 libimgclientFNXXX() が呼び出されることはありませんが、未解決のエラーがあります。

HP でビルドされたまったく同じコードは、エラーなしで正常に動作します。

どんな入力でも大歓迎です。

ありがとう、

4

2 に答える 2

2

ええ、コードを呼び出すつもりがない場合でも、ライブラリ関数を「使用していない」ことはエラーになる可能性があります。一部のコンポーネントのロードを後で延期することができるため、エラーが発生しない場合があります。存在しないものへの参照を持たないことをお勧めします (またはライブラリを手動でロードしてアドレスを取得します。関数が存在しない場合は、「関数の検索」呼び出しからエラーが発生し、何かを行うことができますコードで賢明です)。

ローダー (バイナリ実行可能ファイルをロードするコード) はあまり賢くないため、何が呼び出され、何が呼び出されていないかを正確に認識できません。また、コンパイラが異なれば、「デッド コードの削除」に対する巧妙さのレベルも異なる可能性があります。したがって、あるコンパイラは「呼び出されない」関数を完全に削除しますが、別のコンパイラはそれを削除しません [100% 認定するための巧妙さが得られないためです。関数を決して呼び出さないこと-たとえばgccでは、静的関数を作成した場合、これをlibimgclientFNXXX認識します-静的関数はこのモジュールの外部で呼び出されず、このモジュールはそれを使用していないことを知っているためです。

于 2012-12-24T16:46:34.353 に答える
2

AIX では、ロード時にすべてのシンボルを解決する必要があるため、ビルドは正常に行われますが、シンボルが参照されるため、アプリケーションは実行されません。

.so (リンク オプション) には遅延リンクを使用する必要があり-blazyます。これにより、不足している関数が最初の使用時にのみリンクされるようになります。

ただし、ライブラリに未定義のシンボルを残すべきではありません。別のライブラリのシンボルが必要な場合は、それらにリンクする必要があります (シンボルがアプリ自体で公開されているプラ​​グインでない限り)。

于 2012-12-24T16:48:56.267 に答える