Задать вопрос
@djEban

Что отвечает за предотвращение нежелательной записи в text секцию?

#define ADDR(ptr) *((volatile unsigned char *) ptr)

void some_fn() {}

int main()
{
    ADDR(&some_fn) = 0;
    return 0;
}


И получаю ошибку "bus error", то есть, как я понял, ЦПУ физически не может туда ничего записать, хотя такой адрес есть.
  • Вопрос задан
  • 120 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
AshBlade
@AshBlade
Просто хочу быть счастливым
Я вижу тут 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

Все-таки можно изменить

Есть системный вызов ptrace, который вообще-то может изменить секцию кода, но проблема в том, что он работает с инструкциями и работать можно только с дочерним процессом. Грубо говоря, выступешь в роли отладчика.
Поэтому можешь считать, что .text не изменить
Ответ написан
15432
@15432
Системный программист ^_^
Если это микроконтроллер, то код вполне может находиться в read-only памяти - на флешке ПЗУ, запись в которую нельзя выполнить просто по указателю.
В иных случаях за это отвечает модуль MPU (memory protection unit), который кто-то в системе настраивает.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Память помечена, как read-only.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы