Pull to refresh

Comments 8

Страуструп там. Но таки постаревший, да.

Чего только не выдумают люди, чтобы не писать на смоллтоке.

Писали, но нет в нем той остроты ощущений

После прочтения первой статьи думал, как можно реализовать что-то подобное, пришло в голову то, что если иметь доступ к таблицам адресов, используемых компилятором при генерации финального кода, то можно, используя для каждой функции обёртку, делающую jmp по адресу тела функции, при изменении 1 функции в какой-то единице трансляции находить тот самый jmp в обёртке и менять там адрес, тем самым адресуя все вызовы на новоподгруженный код, который скомпилирован с использованием текущей таблицы имён, и при компиляции он её использует и меняет. Таким образом можно прямо в рантайме перекомпилировать всего лишь 1 файл и получать работающий по новому код. Хз насколько возможно реализовать такую схему без большого вмешательства в код компилятор, но схема выглядит рабочей.
Схема действительно будет работать, для этого можно использовать те же релокации, только не переменных, о которых идет речь в этой статье, а функций, и не новый код изменять, а уже живущий. Я думал по этой же схеме подменять вызовы функций (то есть собираем новый код с функцией А и в каждом месте программы, где используется функция А, меняем адрес вызова на адрес новой функции), но чтение релокаций для функций занимает очень много времени, поскольку мест вызова функций гораздо больше самих функций (в несколько раз)
так прикол с обёрткой как раз в том что нужно только один адрес изменить: тот что в jmp в обёртке.

А, понял. Тогда да, это было бы удобно. Но без патчинга компилятора вряд ли получится, по крайней мере я таких опций не нашел.
Подход msvc в этом плане очень хорош, в gcc не так давно залили аналог под названием -fpatchable-function-entry=N[,M]. Мне же больше интересен clang, поэтому этот флаг в расчет не брал

Sign up to leave a comment.

Articles

Change theme settings