Plugins C++ Problèmes ABI sur Linux

Je travaille sur un système de plugin pour remplacer les bibliothèques partagées.

Je suis conscient des problèmes ABI lors de la conception d'une API pour les bibliothèques partagées et les points d'entrée dans les bibliothèques, tels que les classes exportées, doivent être soigneusement conçus.

Par exemple, l'ajout, la suppression ou la réorganisation de variables membres privées d'une classe exportée peut entraîner différentes erreurs de disposition de la mémoire et d'exécution (d'après ma compréhension, c'est pourquoi le modèle Pimpl pourrait être utile). Bien sûr, il existe de nombreux autres pièges à éviter lors de la modification des classes exportées.

J'ai construit un petit exemple pour illustrer ma question.

Tout d'abord, je fournis l'en-tête suivant pour le développeur du plugin :

// character.h
#ifndef CHARACTER_H
#define CHARACTER_H

#include <iostream>

class Character
{
public:
    virtual std::string name() = 0;
    virtual ~Character() = 0;
};

inline Character::~Character() {}

#endif

Ensuite, le plugin est construit comme une bibliothèque partagée " libcharacter.so" :

#include "character.h"
#include <iostream>

class Wizard : public Character
{
public:
    virtual std::string name() {
        return "wizard";
    }
};

extern "C"
{
    Wizard *createCharacter()
    {
        return new Wizard;
    }
}

Et enfin l'application principale qui utilise le plugin :

#include "character.h"
#include <iostream>
#include <dlfcn.h>

int main(int argc, char *argv[])
{
    (void)argc, (void)argv;

    using namespace std;

    Character *(*creator)();

    void *handle = dlopen("../character/libcharacter.so", RTLD_NOW);

    if (handle == nullptr) {
        cerr << dlerror() << endl;
        exit(1);
    }

    void *f = dlsym(handle, "createCharacter");
    creator = (Character *(*)())f;

    Character *character = creator();
    cout << character->name() << endl;

    dlclose(handle);

    return 0;
}

Est-il suffisant de définir une classe abstraite pour se débarrasser de tous les problèmes ABI?

+1
2019-09-17 15:19:40
source
0 réponses

Voir d'autres questions sur les étiquettes