Einfache ausführbare segfaults beim Start, wenn pthreads verlinkt werden

8

Ich habe den ganzen Tag damit verbracht, diesen Fehler zu untersuchen, und meine Kollegen sagen, dass er wie ein Linker- oder Bibliotheksfehler aussieht. So etwas hatte ich noch nie zuvor, also bin ich hier, um es zu dokumentieren und um Hilfe zu bitten!

Meine ausführbaren segfaults vor main werden

genannt %Vor%

Der resultierende Absturz scheint ähnlich zu dieser Frage Das führt zu diesem Fehlerbericht , aber mein Code ist anders und sehr empfindlich gegenüber Änderungen. Ich habe das Thema auf 5 Anforderungen beschränkt:

  1. Lassen Sie eine Klasse in einer gemeinsam genutzten Bibliothek implementieren.
  2. Deklarieren Sie eine Instanz dieser Klasse in einer anderen, unmittelbar nach einer std. :: string-Memberdeklaration.
  3. Schließen Sie iostream
  4. ein
  5. Verbindung mit Pthreads
  6. Verwenden Sie g ++ - 4.8 (oder 4.9) und den Gold-Linker

Das ist es. Ändern Sie oder lassen Sie eine Anforderung aus, und der Segfault tritt nicht auf.

Ich habe einen minimalen Testfall erstellt. Hier ist der ausführbare Header

%Vor%

Und die Hauptfunktion ist leer. Ich konstruiere nicht einmal die Klasse, die ich definiert habe!

%Vor%

Die Crash-Klasse kann nicht viel einfacher werden

%Vor%

Aber es erfordert eine Implementierung, um eine gemeinsame Bibliothek zu erstellen.

%Vor%

Ich habe das auch in einem Docker-Container auf einer neuen Installation von Ubuntu 14.04 getestet, wobei g ++ - 4.8 über apt-get installiert wurde.

Hier ist das Build-Skript.

%Vor%

Ich habe den ganzen Code in ein Github-Repo gesteckt: crash_test

Rat geschätzt!

    
matt 15.01.2016, 07:33
quelle

1 Antwort

3

Es scheint, dass Sie auf das Problem stoßen, das in dieses gold Ticket beschrieben wird. Basierend auf den Kommentaren zu diesem Ticket hat die folgende Problemumgehung das Problem für mich gelöst: Ändern Sie die Linker-Befehlszeile so, dass sie den Parameter -Wl,--no-as-needed enthält. Für dein Build-Skript wäre das:

%Vor%

Aber wie gesagt, das ist nur ein Workaround, und ich bin mir nicht sicher, ob das eine akzeptable Lösung für Sie ist. Wenn Sie eine angemessene Lösung benötigen, sollten Sie dieses Ticket wahrscheinlich wiederbeleben und Ihre Ergebnisse dort veröffentlichen.

    
mindriot 15.01.2016 13:39
quelle

Tags und Links