Можно ли сделать горячую замену кода в C?

это

en.wikipedia.org/wiki/Горячая_замена#cite_note-1

говорит, что VS может сделать это с помощью своего отладчика. Предоставляет ли gdb аналогичную функциональность?

это самое близкое, что я мог найти, но, похоже, не готов к использованию:

http://www.aitdspace.gr/xmlui/handle/123456789/219

dlopen/dlsym/dlclose также близки, но не будут работать для библиотек, на которые ссылаются -lmylib (счетчик ссылок никогда не достигает 0).

альтернативы, которые я рассматривал:

1) используя -Wl,-wrap,foo и __wrap_foo() { func = dlopen(); функция(); }

2) сделать libfoo.so разделяемой библиотекой, и когда нам нужно выполнить горячую замену, мы dlopen(RTLD_GLOBAL) для загрузки нового кода и предоставления обновленных символов для следующего вызова foo();

1) работает не очень хорошо, потому что мне нужно перечислить все функции, которые я хочу использовать в режиме «горячей замены», а это все они.

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


person Sam Goto    schedule 19.10.2010    source источник
comment
См. также самоизменяющийся код и батут?   -  person dmckee --- ex-moderator kitten    schedule 20.10.2010


Ответы (3)


Вы, безусловно, можете взломать себе систему, в которой вы храните список указателей на функции и можете изменить эти указатели, чтобы они указывали на любую библиотеку, которую вы использовали dlopen() в то время.

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

Может быть, сработает символ, который слаб в вашем коде и силен в библиотеке dlopen()?

В любом из этих случаев вам придется иметь дело с ситуацией, когда в настоящее время работает старый код. Это тоже непросто, если только у вас нет точек в вашей программе, где вы знаете, что в библиотеке нет ни одного потока, который вы хотите поменять местами.

person Keith Randall    schedule 19.10.2010
comment
есть ли способ «отменить определение» символа? dlopen(RTL_GLOBAL) определяет символы глобально, но только для библиотек, которые загружаются после него. если бы я несколько раз использовал dlopen(RTL_GLOBAL) для горячей замены, мне нужно было бы, чтобы символы были «забыты» для перезагрузки. идеи? - person Sam Goto; 20.10.2010
comment
Вы можете взломать PLT самостоятельно из gdb. - person R.. GitHub STOP HELPING ICE; 20.10.2010

Вас может заинтересовать Ksplice. Это технология, разработанная Массачусетским технологическим институтом и позволяющая применять программные исправления к ядру Linux без перезагрузки. Это наиболее актуально для применения обновлений безопасности:

http://www.ksplice.com/paper

person Noah Watkins    schedule 20.10.2010

самое близкое, что я нашел, - это solari dbx, который поставляется со студией разработчиков Oracle, однако студия разработки использует dbx как в Linux, так и в Solaris, только версия Solaris поддерживает «редактирование и продолжение» или «горячую замену кода»

person user818117    schedule 04.04.2018