Ошибка запуска исполняемого файла C ++ в AIX

Я сталкиваюсь с уникальной проблемой в процессе миграции наших приложений с 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, прекрасно работает без ошибок.

Любые входы приветствуются.

Спасибо,

2

Решение

Да, «неиспользование» библиотечной функции все равно может быть ошибкой, даже если вы не собираетесь вызывать код. Он МОЖЕТ отложить загрузку какого-либо компонента на более поздний срок, поэтому он МОЖЕТ не вызвать ошибку. Лучше всего не иметь ссылки на вещи, которые не существуют (или вручную загрузить библиотеку и получить адрес, если функция не существует, вы получите сообщение об ошибке при вызове «find the function» и можете сделать что-то толково в коде).

Загрузчик (код, который загружает двоичные исполняемые файлы) не очень умен, поэтому он не может точно знать, что вызывается, а что нет. Также возможно, что разные компиляторы имеют разные уровни умения для «удаления мертвого кода», поэтому один компилятор полностью удаляет «никогда не вызываемую» функцию, но другой компилятор не удаляет ее [потому что он не обладает умением на 100% сертифицировать что вы никогда не вызываете функцию — например, в gcc, это будет известно, если вы сделаете libimgclientFNXXX статическая функция — потому что она знает, что статические функции не вызываются вне этого модуля, и этот модуль не использует ее.

2

Другие решения

AIX требует разрешения всех символов во время загрузки, поэтому, несмотря на то, что он работает нормально, поскольку на этот символ ссылаются, приложения не будут работать.

Вам нужно использовать ленивые ссылки для .so ( -blazy опция ссылки), которая должна вызывать связывание отсутствующей функции только при первом использовании.

Вы действительно не должны оставлять неопределенные символы в библиотеке, хотя — если для этого нужны символы из другой библиотеки, вы должны ссылаться на них (если это не плагин, где символ отображается в самом приложении).

2