Почему возникает ошибка "bus error" при попытке записи значения по адресу функции на языке C?
1. Для предотвращения нежелательного добавления текста в секцию "text" можно использовать механизмы защиты на уровне операционной системы, например, права доступа к файлам и директориям. Также можно использовать различные антивирусные программы и механизмы обнаружения вредоносного ПО. 2. Ошибка "bus error" в языке C может возникать из-за попытки записи значения по адресу функции из-за различных причин, включая: - Неправильное использование указателей: попытка записи значения по адресу функции, который на самом деле является указателем на функцию, может привести к ошибке "bus error". - Недопустимая операция с памятью: попытка записи в память, которая не является доступной для записи, может привести к ошибке "bus error". - Неправильное чтение/запись данных: если данные, которые пытаются быть записаны, не соответствуют ожидаемому типу данных, это также может вызвать ошибку "bus error". Для избежания ошибки "bus error" необходимо тщательно проверять код на наличие ошибок, связанных с указателями и операциями с памятью, а также уделять внимание типам данных и их совместимости при чтении и записи.
Я вижу тут 2 варианта:
1. Адрес функции не выровнен, это и вызывает SIGBUS
2. Тут баг с назначением номеров сигналов и на самом деле тебе поступает SIGSEGV, т.к. адрес неверный
Второе прямо описывается в man'еman 7 signals
BUGS
For example, an invalid memory access that causes delivery of SIGSEGV
on one CPU architecture may cause delivery of SIGBUS on another archi‐
tecture, or vice versa.
Отвечая на твой вопрос, что предотвращает запись в секцию.text
- флаги секций. У каждой секции есть свои флаги, которые отвечают за возможности работы с этими секциями.
Для этого можно использоватьobjdump -h <executable>
. В частности, я запустил и вот такой вывод появился для бинарника
14 .plt.sec 00000020 0000000000001060 0000000000001060 00001060 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 15 .text 00000118 0000000000001080 0000000000001080 00001080 2**4 CONTENTS, ALLOC, LOAD, READONLY, CODE 16 .fini 0000000d 0000000000001198 0000000000001198 00001198 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE
Можешь заметить, что .text помечен как READONLY
Если это микроконтроллер, то код вполне может находиться в read-only памяти - на флешке ПЗУ, запись в которую нельзя выполнить просто по указателю.
В иных случаях за это отвечает модуль MPU (memory protection unit), который кто-то в системе настраивает.
Память помечена, как read-only.