2015-12-16 11 views
6

Ich habe einen unaufgelösten Symbolfehler beim Versuch, mein Programm zu kompilieren, das beschwert, dass es __dso_handle nicht finden kann. In welcher Bibliothek ist diese Funktion normalerweise definiert?Wo ist __dso_handle definiert?

Bedeutet das folgende Ergebnis von nm on libstdc++.so.6, dass es das enthält?

Ich habe versucht, dagegen zu verknüpfen, aber der Fehler tritt immer noch auf.

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

Antwort

8

__dso_handle ist ein "Wächter", die used to identify dynamic shared objects during global destruction ist.

Realistisch sollten Sie hier aufhören zu lesen. Wenn Sie versuchen, die Objektidentifikation zu vereiteln, indem Sie mit __dso_handle herumspielen, ist wahrscheinlich etwas sehr falsch.

Da Sie jedoch gefragt haben, wo es definiert ist: Die Antwort ist komplex. Um die Position seiner Definition (für GCC) zu erweitern, verwenden Sie iostream in einer C++ - Datei und danach extern int __dso_handle;. Das sollte den Ort der Deklaration aufgrund eines Typkonflikts auftauchen (siehe this forum thread für eine Quelle).

Manchmal ist es defined manually.

Manchmal wird es von der vom Compiler installierten "runtime" definiert/geliefert (in der Praxis ist die CRT normalerweise nur ein Bündel von binären Header-/Entry-Point-Management-Codes und einigen Exit-Wächtern/Handlern). In GCC (nicht sicher, ob andere Compiler unterstützen dies, und wenn ja, wird es in den Quellen):

Oft ist definiert, in die stdlib:

Weiterführende Literatur:

0

ich in dieses Problem lief. Hier sind die Bedingungen, die zuverlässig scheinen die Probleme zu erzeugen:

  1. g ++ Verknüpfung ohne die C/C++ Standardbibliothek: -nostdlib (typisches kleines Embedded-Szenario).
  2. Definieren eines statisch zugewiesenen Standardbibliotheksobjekts; spezifisch für meinen Fall ist std::vector. Zuvor war dies std::array statisch ohne Probleme zugeordnet. Offensichtlich werden nicht alle std:: statisch zugewiesenen Objekte das Problem verursachen.
  3. Beachten Sie, dass ich keine gemeinsam genutzte Bibliothek eines beliebigen Typs verwenden.
  4. GCC/ARM cross compiler wird verwendet.

Wenn dies Ihr Anwendungsfall dann nur über die Befehlszeile Befehlszeilenoption, um Ihre Kompilierung/Link hinzufügen: -fno-use-cxa-atexit

Hier ist eine sehr gute Verbindung zum __dso_handle usage as 'handle to dynamic shared object'.

Es erscheint ein Tippfehler in der Seite zu sein, aber ich habe keine Ahnung, wer zu bestätigen kontaktieren:

Nach der Objekte Konstruktor Destruktoren aufgerufen haben GCC ruft automatisch die Funktion ...

ich denke, das „Sobald alle Destruktoren aufgerufen wurden GCC die Funktion aufruft“ lesen sollte ...

Eine Möglichkeit, dies zu bestätigen, wäre die __cxa_atexit Funktion zu implementieren, wie erwähnt und dann das Programm Schritt und sehen, wo es wird angerufen. Ich werde das in diesen Tagen versuchen, aber nicht jetzt.

Verwandte Themen