2010-11-15 5 views
4

Je construis un compilateur et une machine virtuelle pour exécuter mon code d'octet. Le langage permet de lier des fonctions C externes, qui peuvent être définies dans certains objets partagés externes, ainsi que le binaire principal du compilateur/machine virtuelle (certains langages de langage essentiels).dlopen()/dlsym() sur l'exécutable principal: comment est-ce portable?

Je sais que je peux lier dynamiquement des symboles dans l'exécutable principal avec dlopen (NULL, ...), mais PAS après avoir exécuté strip sur le binaire. J'ai les questions suivantes alors:

  1. Y at-il un moyen de le faire sur un binaire striped?
  2. À quel point cette fonctionnalité est-elle portable sur les systèmes UNIX en général?
  3. Est-il possible de faire le même tour sous Windows en quelque sorte?
  4. Toutes les méthodes alternatives de liaison dynamique au sein de l'exécutable principal?
+0

drôle, je venais récemment entrepris de créer un langage et une machine virtuelle, appelée [Kava] (http://www.yannbane.com/2012/12/kava. html). – corazza

Répondre

6
  1. Utilisez strip -d plutôt que des symboles de débogage de la bande.

  2. La page de manuel dlopen(3) dit:

    CONFORMING TO 
         POSIX.1-2001 describes dlclose(), dlerror(), dlopen(), and dlsym(). 
    

    Donc, très portable sur * nix. À la place, Windows utilise LoadLibrary() et GetProcAddress().

  3. n °

+0

Ignacio, merci. On dirait que vous vouliez dire 'strip -s symbols-file binary', ce qui fonctionnerait bien, sauf sur Darwin, il est dit:" strip: suppression des symboles globaux d'un lien final n'est plus supporté.Utilisez -exported_symbols_list au moment de la liaison lors de la construction: .. "Mais de toute façon, c'est un bon point de départ pour moi. En outre, je crains que Windows aura quelques surprises comme d'habitude, mais nous verrons ... – mojuba

+0

Désolé, parce que je testais cela sur OS X il y avait un peu de confusion avec les options. La seule façon portable d'exécuter strip est 'strip -Sx ...', aussi gcc devrait être exécuté avec '-rdynamic' sous Linux (pas nécessaire pour Darwin). Un peu brouillon mais gérable je suppose. – mojuba

+0

@ IgnacioVazquez-Abrams: 4. Qu'en est-il d'une table de consultation avec des pointeurs de fonction? – user877329