Principale del programma e libreria condivisa inizializza stessa variabile statica in __static_initialization_and_destruction_0
-
26-09-2019 - |
Domanda
Qualcuno sa il motivo per cui una libreria inizializzato all'interno di dlopen () sarebbe inizializzare una variabile statica di proprietà del programma principale. Sia il programma principale e libreria condivisa hanno una copia della variabile statica, ma per qualche motivo la libreria condivisa ri-inizializza la copia del programma principale della variabile statica e distrugge, causando un segfault quando i principali tentativi di programma per distruggere esso.
Si tratta di un caso di cattiva reputazione pressare nella tabella dei simboli?
Soluzione
Questo è un caso in cui il linker runtime vuole solo una singola copia attiva di un simbolo in un processo. Se sia un oggetto condiviso e l'eseguibile hanno una copia del simbolo, il linker runtime risolverà tutti i riferimenti a uno di quelli.
Cosa si può fare per risolvere questo problema è quello di ridurre l'uso dei simboli con il comando versione dell'editor di collegamento quando si costruisce l'oggetto condiviso. Assicurarsi che il simbolo per la variabile statica non è globale e si otterrà il comportamento che si sta cercando.