2010-10-19 12 views
2

ceEst-il possible de faire un échange de code à chaud dans C?

en.wikipedia.org/wiki/Hot_swapping#cite_note-1

dit que VS peut le faire avec l'aide de son débogueur. Est-ce que gdb fournit une fonctionnalité similaire?

c'est le plus proche que je pouvais trouver, mais ne semble pas être prêt à être utilisé:

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

dlopen/dlsym/dlclose sont également proches, mais ne fonctionnera pas pour -lmylib référencé bibliothèques (le nombre de références n'est jamais égal à 0).

alternatives je l'ai considéré:

1) en utilisant -Wl, -wrap, foo et __wrap_foo() {func = dlopen(); func(); }

2) de faire libfoo.so une bibliothèque partagée et quand nous avons besoin de hotswap nous dlopen (RTLD_GLOBAL) pour charger le nouveau code et fournir des symboles mis à jour à l'appel suivant à foo();

1) ne fonctionne pas très bien car il m'oblige à énumérer toutes les fonctions que je veux hotswap, qui sont toutes.

2) ne fonctionne pas très bien car lorsque foo() est appelé, le nouveau code est chargé, mais foo a toujours la référence à ce symbole. appeler dlopen plusieurs fois fait que foo doit être réévalué.

+0

Voir aussi [ "code automodifiable"] (http://en.wikipedia.org/wiki/Self-modifying_code) et [ "trampoline"] (http://en.wikipedia.org/wiki/Trampoline_%28computers%29)? – dmckee

Répondre

0

Vous pouvez certainement vous pirater un système où vous stockez une liste de pointeurs de fonction et pouvez changer ces pointeurs pour pointer vers la bibliothèque que vous avez dlopen() 'd à la fois.

Vous avez raison, il n'y a pas de moyen facile d'intercepter les appels à des routines à liaison fixe. Vous pouvez toujours clober le début de la routine avec un saut d'assemblage vers une autre routine, mais cela peut être dangereux (et n'est pas C). Peut-être un symbole qui est faible dans votre code et fort dans une bibliothèque dlopen() 'd fonctionnerait?

Dans tous ces cas, vous devez gérer la situation où l'ancien code est en cours d'exécution. Ce n'est pas facile non plus, sauf si vous avez des points dans votre programme où vous savez qu'il n'y a pas de thread dans la bibliothèque que vous voulez échanger.

+0

Y a-t-il un moyen de «dé fi nir» un symbole? dlopen (RTL_GLOBAL) définit des symboles globalement, mais uniquement pour les bibliothèques qui sont chargées après lui. si je devais dlopen (RTL_GLOBAL) plusieurs fois à hotswap, j'aurais besoin que les symboles soient 'oubliés' pour être rechargés. des idées? –

+0

Vous pouvez vous-même pirater le PLT à partir de gdb. –

2

Vous pouvez être intéressé par Ksplice. C'est une technologie issue du MIT qui permet d'appliquer des correctifs logiciels au noyau Linux sans redémarrer. Ceci est le plus pertinent pour l'application des mises à jour de sécurité:

http://www.ksplice.com/paper