Valgrind-Fehler bei Verknüpfung mit -static – Warum?

Lesezeit: 3 Minuten

Benutzer-Avatar
John Gordon

Ich habe einen Testtreiber, der mit einer von mir geschriebenen Bibliothek verknüpft ist. Die Bibliothek verwendet Autotools, sodass sowohl ein Archiv (.a-Datei) als auch eine dynamische Bibliothek (.so) erstellt werden.

Wenn ich meinen Treiber mit ‘g++ -static’ verlinke, vermutlich mit dem .a, leuchtet valgrind auf und beschwert sich wiederholt: ‘Bedingter Sprung oder Bewegung hängt von nicht initialisierten Werten ab’. Der erste Fehler tritt vor main in __pthread_initialize_minimal auf.

Wenn ich ohne -static verlinke, vermutlich mit .so, erhalte ich keine Valgrind-Beschwerden.

Weiß jemand warum? Funktioniert Valgrind einfach nicht mit -static?

AKTUALISIEREN: Ich kann nicht einmal eine abgespeckte Version meines Treibers posten, weil er auf eine sehr große Bibliothek verweist, die ich unmöglich abpimpen könnte, aber ich bemerke, dass das einfachste aller Programme ist

int main()
{
  return 0;
}

gibt einen Fehler aus, wenn es mit -static verknüpft und von valgrind ausgeführt wird:

==15449== Use of uninitialised value of size 8
==15449==    at 0x40B0F3: exit (in /home/jdgordo/src/t)

Ich hätte hinzufügen sollen, dass ich auf 64-Bit-Redhat 5.5 laufe.

  • Versuchen Sie, das Problem auf so wenige Zeilen OS-Code wie möglich einzugrenzen, und posten Sie es hier.

    – faso

    21. September 2011 um 20:25 Uhr

  • Es gibt viele Lücken und Abkürzungen in den verschiedenen Systembibliotheken, so dass es nicht ungewöhnlich ist, dass diese in Valgrind auftauchen. Sie könnten versuchen, sie systematisch zu ignorieren, nehme ich an, oder einfach Ihre Tests mit der gemeinsam genutzten Version durchführen.

    – Kerrek SB

    21. September 2011 um 20:34 Uhr

  • Ich sehe das nicht auf meinem System. @KerrekSB – hat aber Recht, es ist nicht wirklich etwas, worüber man sich Sorgen machen muss, und Valgrind-Schiffe mit einer großen Datei, die die meisten davon unterdrückt. Es stimmt wahrscheinlich irgendwie nicht mit Ihrer libc/compiler-Version auf Ihrem System überein.

    – Flexo

    21. September 2011 um 20:54 Uhr

Funktioniert Valgrind einfach nicht mit -static?

Es tut. Das Problem liegt nicht in Valgrind, sondern in glibc, was nicht Valgrind clean ist. Die Glibc-Entwickler weigerten sich, diese Probleme zu beheben (weil die Probleme “egal” sind und ihre Behebung (ein paar) Zyklen kostet).

Beim dynamischen Verlinken kommen diese Fehler daher libc.so.6und kann leicht unterdrückt werden, was Valgrind standardmäßig tut.

Aber wenn Sie statisch verlinken, kommen diese Fehler von Ihrer ausführbaren Datei (die jetzt Code von libc.a), und daher werden sie von den standardmäßigen Valgrind-Unterdrückungen nicht unterdrückt.

Sie könnten neue Unterdrückungen schreiben (siehe Valgrind --gen-suppressions=yes Dokumentation).

Oder Sie könnten installieren und verwenden glibc-Audit.

  • Wird Valgrind malloc- und kostenlose Aufrufe abfangen, wenn libc statisch gelinkt ist?

    – Mohammed Bana

    24. Juli 2012 um 12:18 Uhr

Wenn die Bibliothek Probleme in Valgrind verursacht, können Sie diese Probleme nur ignorieren, indem Sie Schreiben von Unterdrückungsdateien.

Eines der Probleme, auf die ich gestoßen bin, ist das Zuordnen von etwas auf dem Haufen, wie folgt:

// library
int * some = new int;

// main links the library
int main()
{
}

Dieses Beispiel würde einen Fehler bezüglich eines Lecks melden.

BEARBEITEN: Wenn Sie die Quelle der Bibliothek haben, können Sie den Fehler beheben (Verwendung einer nicht initialisierten Variablen) und neu kompilieren.

1015860cookie-checkValgrind-Fehler bei Verknüpfung mit -static – Warum?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy