Problemas de ABI en Linux

Estoy trabajando en un sistema de complementos para reemplazar las bibliotecas compartidas.

Soy consciente de los problemas de ABI al diseñar una API para libs compartidas y los puntos de entrada en las libs, como las clases exportadas, deben diseñarse cuidadosamente.

Por ejemplo, agregar, eliminar o reordenar variables de miembros privados de una clase exportada puede dar lugar a diferentes errores de diseño de memoria y tiempo de ejecución (por lo que entiendo, es por eso que el patrón Pimpl podría ser útil). Por supuesto, hay muchos otros escollos a evitar al modificar las clases exportadas.

He construido un pequeño ejemplo aquí para ilustrar mi pregunta.

Primero, proporciono el siguiente encabezado para el desarrollador del 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

A continuación, el complemento se construye como una lib compartida " 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;
    }
}

Y finalmente la aplicación principal que utiliza el 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;
}

¿Es suficiente definir una clase abstracta para deshacerse de todos los problemas de ABI?

+1
2019-09-17 15:19:40
fuente
0 respuestas

Vea otras preguntas sobre etiquetas