2015-12-16 42 views
6

Ho un errore di simbolo non risolto durante il tentativo di compilare il mio programma che si lamenta del fatto che non riesce a trovare __dso_handle. In quale libreria è normalmente definita questa funzione?Dove è definito __dso_handle?

Il seguente risultato da nm on libstdc++.so.6 significa che contiene quello?

Ho provato a collegarlo ma l'errore si verifica ancora.

nm libstdc++.so.6 | grep dso 
00000000002fc480 d __dso_handle 

risposta

8

__dso_handle è una "guardia" che è used to identify dynamic shared objects during global destruction.

Realisticamente, dovresti smettere di leggere qui. Se stai cercando di sconfiggere l'identificazione degli oggetti facendo scherzi con __dso_handle, qualcosa è probabilmente sbagliato.

Tuttavia, dal momento che hai chiesto dove è definito: la risposta è complessa. Per visualizzare la posizione della sua definizione (per GCC), utilizzare iostream in un file C++ e, successivamente, fare extern int __dso_handle;. Ciò dovrebbe far emergere la posizione della dichiarazione a causa di un conflitto di tipi (vedere this forum thread per un'origine).

A volte, è defined manually.

A volte, è definito/fornito dal "runtime" installato dal compilatore (in pratica, il CRT di solito è solo un mucchio di codice di intestazione/entry-point di gestione binari e alcuni guardie/gestori di uscita). Nel GCC (non so se altri compilatori supportano questa, in tal caso, sarà nelle loro fonti):

Spesso, si è definito in lo stdlib:

Ulteriori approfondimenti:

0

mi sono imbattuto in questo problema. Qui ci sono le condizioni che sembrano generare in modo affidabile il problema:

  1. g ++ collega senza l'/ C++ libreria standard C: -nostdlib (scenario tipico piccolo incorporato).
  2. Definizione di un oggetto libreria standard allocato staticamente; specifico per il mio caso è std::vector. Precedentemente questo era std::array assegnato staticamente senza alcun problema. Apparentemente non tutti gli oggetti allocati staticamente a std:: causeranno il problema.
  3. Nota che non sto utilizzando una libreria condivisa di alcun tipo.
  4. GCC/ARM cross compiler è in uso.

Se questo è il vostro caso d'uso allora semplicemente aggiungere l'opzione riga di comando per la riga di comando/link di compilazione: -fno-use-cxa-atexit

Ecco un ottimo collegamento al __dso_handle usage as 'handle to dynamic shared object'.

Sembra che ci sia un errore di battitura nella pagina, ma non ho idea di chi contattare per confermare:

Dopo aver chiamato i distruttori del costruttore degli oggetti GCC chiama automaticamente la funzione di ...

Penso che questo dovrebbe leggere "una volta che tutti i distruttori sono stati chiamati GCC chiama la funzione" ...

Un modo per confermare questo sarebbe per implementare la funzione __cxa_atexit come detto e poi solo passo il programma e vedere dove viene chiamato Ci proverò uno di questi giorni, ma non adesso.