2010-02-02 5 views
3

Supposons que vous ayez une fonction foo() compilée dans un programme qui s'exécute sous Unix.Comment faire pour patcher Live Running Unix Code

Alors que le programme est en cours d'exécution, peut-on "remplacer" la fonction foo en chargeant dynamiquement un fichier objet contenant une version modifiée de foo()?

Sur un système embarqué sur lequel j'ai travaillé dans le passé, nous pouvions déprotéger le segment de texte et ensuite "patcher" l'adresse de foo() pour pointer vers le foo() nouvellement modifié.

Il a été utilisé pour le débogage à l'occasion et avec beaucoup de contraintes spéciales, sur les sites des clients.

Est-ce possible sur Unix?

+0

Pouvez-vous être plus précis sur les systèmes d'exploitation? En général, oui, mais les obstacles spécifiques auxquels vous serez confrontés sont déterminés par la plate-forme que vous utilisez. – richo

+0

Oui, le système d'exploitation est Solaris et IBM AIX. Merci pour toutes vos réponses. – Foo

Répondre

1

Cela dépend de l'environnement, je suppose. Je sais que le code de production à chaud est trivial dans les modules Erlang et pas trop difficile dans Ruby. C pourrait être un animal différent.

+0

+1 pour avoir mentionné l'échange à chaud intégré d'Erlang – pestilence669

0

En bref, oui, bien sûr que c'est possible. La question devrait vraiment être, "comment difficile?"

Vous pouvez charger & décharger des bibliothèques partagées (.so & .DLL) tout ce que vous voulez sous Linux & Windows. Variantes spécifiques d'UNIX, je ne suis pas sûr. Ce serait le moyen le plus facile d'atteindre votre objectif. Si cela ne vous dérange pas de vous salir les mains, vous pouvez toujours patcher le segment de code pour sauter à un autre endroit sur le tas. Je ne le recommande pas.

1

Oui. C'est comme ça que fonctionnent les débogueurs comme gdb, après tout.

+0

, en particulier via le syscall ptrace(), AFAIK. – asveikau