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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.