Forum: Compiler & IDEs GCC: Wie funktionieren die Bibliotheken?


von Werner (Gast)


Lesenswert?

Hallo,

wegen anhaltender Probleme mit einem Crosscompiler bin ich etwas tiefer 
gegangen und habe nun festgestellt: Ich kompiliere ein einfaches 
Hallo-Welt-Programm (mit arm-linux-gnueabi-g++):
1
#include <iostream>
2
3
using namespace std;
4
5
int main(void) {
6
  cout << "This is a cross compiler hello world!" << endl;
7
}

lasse es auf dem Target laufen und es funktioniert. Dann füge ich hinzu:
1
string s("Test");

Diese Kompilat erzeugt auf dem Target:
1
./Testtt: /usr/lib/arm-linux-gnueabi/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./Testtt)
2
        libstdc++.so.6 => /usr/lib/arm-linux-gnueabi/libstdc++.so.6 (0xb6eb7000)
3
        libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0xb6e87000)
4
        libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6d3e000)
5
        /lib/ld-linux.so.3 (0x7f5a8000)
6
        libm.so.6 => /lib/arm-linux-gnueabi/libm.so.6 (0xb6c8d000)

Wonach und wie unterscheidet der Linker (oder wer?) welche 
Mindestversion gebraucht wird, und wieso wird gerade beim verwenden von 
Strings die neue (auf dem Target nicht vorhandene) benötigt?

Auch die Version ohne den string "zieht" schon die libstdc++ mit an:
1
ldd Testtt
2
        libstdc++.so.6 => /usr/lib/arm-linux-gnueabi/libstdc++.so.6 (0xb6efe000)
3
        libgcc_s.so.1 => /lib/arm-linux-gnueabi/libgcc_s.so.1 (0xb6ece000)
4
        libc.so.6 => /lib/arm-linux-gnueabi/libc.so.6 (0xb6d85000)
5
        libm.so.6 => /lib/arm-linux-gnueabi/libm.so.6 (0xb6cd4000)
6
        /lib/ld-linux.so.3 (0x7f5de000)

Verzweifelt
Werner

von Sven B. (scummos)


Lesenswert?

Es wird gegen eine Version der glibc gelinkt und dieselbe Version muss 
beim Ausführen auch wieder vorhanden sein. Du linkst gegen die eine und 
hast beim Ausführen aber die andere rumliegen, deshalb der Fehler.

von Werner (Gast)


Lesenswert?

Aber das gleiche Problem habe ich doch auch ohne Crosscompiler, und dass 
mein Programm auf einem anderen System mit exakt den gleichen 
Bibliotheksversionen läuft ist doch sehr unwahrscheinlich?

Werner

von Sven B. (scummos)


Lesenswert?

Das ist nicht unwahrscheinlich, sondern zwingend erforderlich. Du kannst 
die Bibliotheken nach dem Linken nur austauschen wenn sie 
binärkompatibel sind (was das im Detail heißt, ist kompliziert, aber 
mindestens sowas wie dass sich keine Funktionssignaturen oder Größen von 
structs geändert haben).

Das mit dem "ohne Crosscompiler" habe ich nicht verstanden, sorry.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das ABI ändert sich ja nicht "einfach so".  Wenn das der Fall wäre, wäre 
es praktisch unmöglich sinnvoll mit Bibliotheken zu arbeiten.

Viele mit dem gleichen Problem machen zwar ein Update, aber ob das nur 
das eigentliche Problem umschifft wird aus dem, was man so findet, nicht 
klar.

Als erstes würd ich in den Caveats der Release Notes von GCC und glibc 
schauen, ob was am ABI geändert wurde.

Ansonsten fällt mir nur -fabi-version ein

http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Dialect-Options.html

von Sven B. (scummos)


Lesenswert?

Johann L. schrieb:
> Das ABI ändert sich ja nicht "einfach so".  Wenn das der Fall wäre, wäre
> es praktisch unmöglich sinnvoll mit Bibliotheken zu arbeiten.

Würde man denken ... aber die ABI von der glibc ändert sich irgendwie 
ständig :/ Zumindest der Version-Check ändert sich ständig ...

von Werner (Gast)


Lesenswert?

>Das mit dem "ohne Crosscompiler" habe ich nicht verstanden, sorry.

Ich mein dass ich auf meinem Ubuntu 12 direkt einfach ein 
Hallo-Welt-Programm kompiliere. Dieses könnte ich z.B. meiner Oma 
schicken bei der etwa ein Ubuntu 15 läuft, also auf jeden Fall auch eine 
andere Version der stdlibc++, aber sie wird das Programm doch ausführen 
können?

Werner

von Sven B. (scummos)


Lesenswert?

Werner schrieb:
>>Das mit dem "ohne Crosscompiler" habe ich nicht verstanden, sorry.
>
> Ich mein dass ich auf meinem Ubuntu 12 direkt einfach ein
> Hallo-Welt-Programm kompiliere. Dieses könnte ich z.B. meiner Oma
> schicken bei der etwa ein Ubuntu 15 läuft, also auf jeden Fall auch eine
> andere Version der stdlibc++, aber sie wird das Programm doch ausführen
> können?

Nein. Probier's. Gibt i.d.R. dieselbe Fehlermeldung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.