GCC: Wie funktionieren die Bibliotheken?

Gast #4455698
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
Gast #4455810
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
#4456303
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.
Persönliche Seite #4456457
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
Gast #4461662
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
#4461725
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren