Вопрос
Может ли кто-нибудь сказать мне, есть ли что-то похожее на 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() и предоставьте свою функцию.Вы не тестируете точно одно и то же программное обеспечение, но различия для такого рода минимальных изменений не должны иметь значения.