Как патчить живую версию кода Unix - PullRequest
3 голосов
/ 02 февраля 2010

Допустим, у вас есть функция foo (), скомпилированная в программу, работающую в Unix.

Во время работы программы можно ли "заменить" функцию foo путем динамической загрузки объектного файла, содержащего измененную версию foo ()?

На встроенной системе, над которой я работал в прошлом, мы могли снять защиту с текстового сегмента и затем «исправить» адрес foo (), чтобы он указывал на недавно измененный foo ().

Он использовался для периодической отладки и со множеством особых ограничений на сайтах клиентов.

Возможно ли это в Unix?

Ответы [ 3 ]

1 голос
/ 02 февраля 2010

Да. В конце концов, именно так работают отладчики, такие как GDB.

1 голос
/ 02 февраля 2010

Полагаю, это зависит от окружающей среды. Я знаю, что рабочий код с горячей заменой тривиален в модулях Erlang и не слишком сложен в Ruby. С может быть другим животным.

0 голосов
/ 02 февраля 2010

Короче говоря, да, конечно, это возможно. Вопрос действительно должен быть «насколько сложно?»

Вы можете загружать и выгружать разделяемые библиотеки (.so & .DLL) сколько угодно в Linux и Windows. Конкретные варианты UNIX, я не уверен насчет. Это был бы самый простой способ достичь вашей цели.

Если вы не возражаете запачкать руки, вы всегда можете залатать фрагмент кода, чтобы перейти в другое место в куче. Я не рекомендую это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...