Можно ли сделать горячий обмен кода в C? - PullRequest
2 голосов
/ 20 октября 2010

это

en.wikipedia.org / вики / Hot_swapping # 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 (); FUNC (); }

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

1) работает не очень хорошо, потому что требует, чтобы я перечислил все функции, которые я хочу переключить, которые все они.

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

Ответы [ 3 ]

2 голосов
/ 20 октября 2010

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

http://www.ksplice.com/paper

0 голосов
/ 04 апреля 2018

самое близкое, что я нашел, это solari dbx, который поставляется с oracle developer studio, однако dev studio использует dbx как в Linux, так и в Solaris, только версия Solaris поддерживает "edit-and-continue" или "горячую замену кода"

0 голосов
/ 20 октября 2010

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

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

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

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

...