Я пытаюсь написать программу, которая позволяет запускать двоичный файл, заменяя один файл по запросу другим. Это библиотека с простыми заменами функций системного вызова, которая используется с LD_PRELOAD. Проблема в том, что он перехватывает открытие для чтения (вместо этого читается замещающий файл), но записи всегда возвращаются к фактическому указанному файлу. Есть ли другие «открытые» системные вызовы, о которых мне следует знать?
Проблема с заменой системных вызовов Linux с использованием LD_PRELOAD
Ответы (4)
Ничего себе - глупая ошибка.
Не проверял как абсолютные, так и относительные пути...
Я не уверен, в чем причина вашей проблемы, но использование strace в вашей программе может дать некоторые на виду. Он должен быть частью любого разумного дистрибутива Linux.
Если он открыт для записи, он, скорее всего, проходит через функцию creat
(я предполагаю, что fopen
перенаправит вас туда). Проверьте свой fcntl.h
для получения полного списка.
замена определенного файла по запросу на другой
Похоже, вы проверяете только входной файл (вы проверяете по имени файла?). Вам также необходимо проверить и заменить выходной файл.
Если ваш вывод идет на один из стандартных выходов, вам нужно закрыть и снова открыть их с помощью заменителя вывода), прежде чем вы разветвитесь на исполняемый файл.
Чтобы найти все системные вызовы, которые делает ваш исполняемый файл, вы можете использовать strace.
Чтобы найти все библиотечные вызовы, которые делает ваш исполняемый файл, вы можете использовать ltrace.