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