Как стать автором
Обновить
21
0

Пользователь

Отправить сообщение

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

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

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

При большом желании это все можно завернуть в c-api, делов на пару часов. Если вам это будет интересно, пожалуйста заведите issue на гитхабе, сделаем
Да, си без проблем подойдет.

По поводу процессов — если честно, просто не подумал об этом. Только на днях вспомнил, что автор библиотеки под windows так и делает, и задумался о том, что не спроста. В комментарии выше человек посоветовал порождать процесс из приложения, и в нем делать всю грязную работу, видимо так и придется сделать.
Хорошо, если вам и правда это принципиально.
Библиотека, которая реализует эту функциональность, написана на c++, пользовательское приложение, к которому линкуется библиотека, должно инстанциировать экземаляр c++ класса, вызывать методы этого c++ класса, возможно реализовать обработку коллбеков от библиотеки в виде наследования от класса-делегата, который тоже является c++ классом. Конечно, при большом желании это можно делать и из не-c++ кода, и перезагружать не-c++ код, но конкретно в этой статье речь идет о c++.
Предлагаю закрыть тему с названием статьи.
Видимо это единственный вариант, спасибо
Задача в том, чтобы остановить все потоки, кроме того, который патчит код.
Поэтому остановка всего процесса со всеми потоками не подходит
man7.org/linux/man-pages/man3/pthread_kill.3.html
Signal dispositions are process-wide: if a signal handler is
installed, the handler will be invoked in the thread thread, but if
the disposition of the signal is «stop», «continue», or «terminate»,
this action will affect the whole process.


Поэтому и сомневаюсь

В смысле через pthread_kill? Вы пробовали провернуть такое? Из того, что удалось нагуглить, это не сработает, но надо пробовать

Не совсем вас понял. В статье идет речь о том, как без перезапуска приложения обновить в нем работающий машинный код, исходником которого является код на c или c++. Формально в машинный код можно скомпилировать не только код на c или c++, но в описанном подходе используется инструментарий для сборки кода именно на этих двух языках. Или я неправильно вас понял?
Это тоже вариант. Может вы еще знаете, как остановить все потоки, кроме текущего, на время патчинга, хотя бы на linux? Чтобы не прибегать к помощи внешней программы
А ведь правда, спасибо за наводку! Жалко в clang этот флаг еще не реализовали
Интересно, посмотрим, спасибо. Бросается в глаза то, что библиотека в некотором роде диктует архитектуру приложения. Но сам подход выглядит необычно для c++

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность