Проблема с заменой системных вызовов Linux с использованием LD_PRELOAD

Я пытаюсь написать программу, которая позволяет запускать двоичный файл, заменяя один файл по запросу другим. Это библиотека с простыми заменами функций системного вызова, которая используется с LD_PRELOAD. Проблема в том, что он перехватывает открытие для чтения (вместо этого читается замещающий файл), но записи всегда возвращаются к фактическому указанному файлу. Есть ли другие «открытые» системные вызовы, о которых мне следует знать?


person c4757p    schedule 29.05.2009    source источник
comment
Пробовали ли вы отслеживать двоичный файл, чтобы увидеть, в какой файловый дескриптор выполняется запись и откуда берется этот fd?   -  person brian-brazil    schedule 29.05.2009


Ответы (4)


Ничего себе - глупая ошибка.

Не проверял как абсолютные, так и относительные пути...

person c4757p    schedule 29.05.2009

Я не уверен, в чем причина вашей проблемы, но использование strace в вашей программе может дать некоторые на виду. Он должен быть частью любого разумного дистрибутива Linux.

person rodion    schedule 29.05.2009

Если он открыт для записи, он, скорее всего, проходит через функцию creat (я предполагаю, что fopen перенаправит вас туда). Проверьте свой fcntl.h для получения полного списка.

person eduffy    schedule 29.05.2009

замена определенного файла по запросу на другой

Похоже, вы проверяете только входной файл (вы проверяете по имени файла?). Вам также необходимо проверить и заменить выходной файл.

Если ваш вывод идет на один из стандартных выходов, вам нужно закрыть и снова открыть их с помощью заменителя вывода), прежде чем вы разветвитесь на исполняемый файл.

Чтобы найти все системные вызовы, которые делает ваш исполняемый файл, вы можете использовать strace.
Чтобы найти все библиотечные вызовы, которые делает ваш исполняемый файл, вы можете использовать ltrace.

person lothar    schedule 29.05.2009