Я вижу тут 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 не изменить