在AIX中启动c++可执行文件时出错

Error launching C++ executable in AIX

本文关键字:可执行文件 出错 c++ 启动 AIX      更新时间:2023-10-16

在将应用程序从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()永远不会被调用。我的make文件如下:

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中构建的完全相同的代码工作得很好,没有错误。

欢迎您的参与。

谢谢,

是的,"不使用"库函数可能仍然是一个错误,即使你不打算调用代码。它可能会延迟某些组件的加载,所以它可能不会导致错误。最好不要引用不存在的东西(或者手动加载库并获取地址,如果函数不存在,你会从"查找函数"调用中得到一个错误,你可以在代码中做一些明智的事情)。

加载器(加载二进制可执行文件的代码)不是很聪明,所以它不能确切地知道什么被调用了,什么没有被调用。也有可能不同的编译器有不同水平的聪明"死代码消除",所以一个编译器完全消除了"从未被称为"功能,但另一个编译器不能删除它(因为它不是有聪明100%保证你永远不会调用该函数——例如,在gcc会知道如果你让libimgclientFNXXX静态函数,因为它知道静态函数不被调用此模块外,和这个模块不使用它。

AIX要求在加载时解析所有符号,因此即使它可以正常构建,但由于符号被引用,应用程序将无法运行。

您需要为.so (-blazy链接选项)使用延迟链接,这应该导致丢失的函数仅在第一次使用时被链接。

你真的不应该在库中留下未定义的符号,但是-如果它需要来自另一个库的符号,你应该链接到它们(除非它是一个插件,其中的符号在应用程序本身暴露)。