Изменяет ли включение LLVM MemorySanitizer ABI библиотек
Проекты LLVM. MemorySanitizer имеет довольно сложное для удовлетворения ограничение, заключающееся в том, что все системные библиотеки также должны быть построены с помощью MemorySanitizer.
Я думал о некоторых способах включения MSAN для проекта, над которым я работаю (он уже использует ASAN и UBSAN), особенно в отношении этого ограничения. Одно из возможных решений, которое я рассматривал, могло бы привести к ситуации, когда при компиляции проекта с-fsanitize=memory
, он будет связываться с неинструментированными версиями динамических системных библиотек, таких как libc
, а также libstdc++
, и скажи libcrypto
(чтобы добавить тот, который на самом деле не является частью "цепочки инструментов"). Но затем во время выполнения инструментальный двоичный файл будет работать в специальной среде (в основном в другом пользовательском пространстве), где все системные динамические библиотеки были построены с-fsanitize=memory
.
Жизнеспособна ли такая схема? Мне кажется, это зависит от того, будет ли построена библиотека с-fsanitize=memory
изменяет свой ABI, потому что, если ABI библиотеки различается между инструментальными и неинструментированными версиями, то образ, созданный для неинструментированных системных динамических библиотек, будет катастрофически отказывать во время выполнения при запуске в среде с инструментальными системными библиотеками.
1 ответ
если ABI библиотеки различается между инструментальной и неинструментированной версиями, то образ, созданный для неинструментированных системных динамических библиотек, катастрофически откажется во время выполнения.
Прежде всего, компиляция с -fsanitize=memory
делает изменения ABI, например, путем добавления дополнительных (теневые) операндов вызовов функций. Это означает, что объединение очищенного и необработанного кода во время выполнения, скорее всего, приведет к сбою.
С другой стороны, Msan не изменяет ABI библиотеки времени компоновки, т. Е. Не изменяет размеры или имена символов, поэтому внешний интерфейс библиотеки (т.е. содержимое ее таблицы символов ELF) скомпилирован с-fsanitize=memory
не меняется.
Это означает, что связывание с незащищенной версией и последующий запуск с очищенной версией в порядке.