Вопрос

Может ли кто-нибудь сказать мне, есть ли что-то похожее на LD_PRELOAD в последних версиях AIX?Точнее, мне нужно перехватывать вызовы из моего двоичного файла в time(), возвращая постоянное время, в целях тестирования.

Это было полезно?

Решение

В AIX 5.3 появилась LDR_PRELOAD (для 32-битных программ) и LDR_PRELOAD64 (для 64-битных программ) переменные.Они аналогичны LD_PRELOAD в Linux.Оба списка представляют собой списки библиотек, разделенных двоеточиями, и символы будут предварительно загружены из перечисленных общих объектов раньше всего остального.

Например, если у вас есть общий объект foo.so:

 LDR_PRELOAD=foo.so

Если вы используете архивы, используйте стиль AIX для указания объекта внутри архива:

 LDR_PRELOAD="bar.a(shr.so)"

И разделите несколько записей двоеточием:

 LDR_PRELOAD="foo.so:bar.a(shr.so)"

Другие советы

AIX 5L использует переменную LDR_PRELOAD.

Не то, чтобы я знал об этом.Самое близкое, что мы сделали (с помощью malloc/free для отладки), это

  • создайте новый файл библиотеки только с нужными функциями (то же имя, что и исходный).
  • поместите его в другой каталог, чем оригинал.
  • сделать зависимость нашего файла библиотеки от оригинала.
  • измените LD_LIBRARY_PATH (или SHLIB_PATH?), чтобы наша библиотека была первой в цепочке поиска.

Таким образом, наши функции сначала подхватываются загрузчиком, а все, что мы не предоставили, предоставляется оригиналом.

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

В качестве альтернативы, если у вас есть источник, объедините вызовы time() с помощью mytime() и предоставьте свою функцию.Вы не тестируете точно одно и то же программное обеспечение, но различия для такого рода минимальных изменений не должны иметь значения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top