Ho scritto una libreria condivisa con diverse versioni incompatibili. Ho cambiato soname, così vengono chiamati:Rileva due versioni ABI incompatibili della mia libreria condivisa caricate nel programma singolo
- lib_mylib.so.1.0.0 (vecchia libreria)
- lib_mylib.so.2.0.0
Ci sono alcune funzioni solo in mylib. so.1, altri sono solo in mylib.so.2 e molte funzioni sono comuni (ma molti hanno cambiato il conteggio degli argomenti)
E temo che sia possibile collegare entrambe le versioni di mylib in una singola applicazione, ad esempio quando l'applicazione stessa è grande e comprende molte librerie. Quando l'applicazione viene ricostruito in parte, non ci può essere tale situazione:
- Applicazione
- app_lib1.so (è stato costruito con mylib.so.1 - prima versione del mio lib)
- app_lib2.so (è stato ricostruito con mylib.so.2 - seconda versione)
Ho già visto l'applicazione con entrambe le versioni caricate in esso (report ldd
entrambi).
Quindi, è possibile aggiungere del codice di controllo a mylib.so.2 per rilevare che sono già caricate entrambe le versioni della libreria e che hanno ABI/Interfaccia in conflitto. (Non posso modificare lib_mylib.so.1 di aggiungere qualcosa in esso)
Posso solo analizzare '/ proc/self/maps' nel costruttore della mia libreria. Penso che sia possibile, al momento dell'esecuzione del mio costruttore dalla seconda libreria, la prima libreria non sarà ancora caricata in memoria (caso 1: mylib2 è precedente a mylib1 nella lista delle librerie; caso 2: mylib1 sarà caricato usando dlopen a qualche tempo dopo) – osgx