Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
*.o Vorgabe Dateien auch für x86
Hallo,
wie wärs eigentlich wenn die Menschen, die die Übungsaufgaben für SP erstellen die *.o Dateien auch mal für x86 kompilieren?
Das fänd ich ziemlich super, weil man dann auch daheim vom x86 Rechner seine Aufgaben kompilieren kann ohne VM-Ware. Da ich leider auch keinen i386 Rechner habe und das ssh zur Uni immer so langsam ist
Vielleicht gibt es einen guten Grund das nicht zu tun, daher wär mir ein Statement ganz lieb
Hallo.
Ich vermute, du redest von SP2. Die bereitgestelle Objekt-Datei tut ohne Probleme auf x86
file getargs.o
getargs.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
Willst du zum Ausdruck bringen, dass du ein 64-Bit System hast?
Muss ich die 2 Zeilen in das Makefile einfügen? Und ja, bin auf einem 64bit System.
Ahhh…das macht die Sache schon klarer.
Füge einfach zu den CFLAGS den Parameter [m]-m32[/m] hinzu. Damit erzeugt der GCC dann 32-Bit Objekte und Binaries und kann auch mit 32-Bit Objekten umgehen.
Das 32-Bit Binary solltest du auch mit deinem 64-Bit Kernel ausführen können.
Nun krieg ich diese Fehlermeldungen:
jan@jan-ThinkPad-Edge:~/SP2/Übungen/aufgabe1$ make
gcc -m32 -std=c99 -pedantic -D_XOPEN_SOURCE=600 -Wall -Werror -o simail simail.o getargs.o
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find crtn.o: No such file or directory
collect2: ld gab 1 als Ende-Status zurück
make: *** [simail] Fehler 1
Fehlen mir wohl ein paar Sachen zum kompilieren. Ich weiß nur nicht was…
Die Architekturbezeichnungen sind nicht immer so einfach zu durchschauen…
mit [m]x86[/m], [m]x86-32[/m], [m]i386[/m], etc. sind oft 32-bit-Systeme gemeint,
mit [m]x86-64[/m] oder [m]x64[/m], etc. 64-bit
Hast du die 32bit-Bibliotheken installiert? Unter Debian/Ubuntu heißen die Packages vermutlich [m]libc6-i386[/m], [m]libc6-dev-i386[/m] (siehe Postings von lusiux und Airhardt)
Dir fehlt die Umgebung für 32-Bit Entwicklung. Unter Ubuntu heisst dieses Paket zum Beispiel: gcc-multilib.
Hab die Lib nun nachinstalliert, jetzt kommt aber wieder die Fehlermeldung wegen i386.
gcc -m32 -std=c99 -pedantic -D_XOPEN_SOURCE=600 -Wall -Werror -I /proj/i4sp2/pub/aufgabe1/ -o simail simail.o getargs.o
/usr/bin/ld: i386:x86-64 architecture of input file `simail.o' is incompatible with i386 output
collect2: ld gab 1 als Ende-Status zurück
make: *** [simail] Fehler 1
Ich denk mal das kann man mit der o.g. Codezeile beheben
file getargs.o
getargs.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
Nur, wohin damit? Wenn ich es in das Makefile schreibe, kommt auch nur ne Fehlermeldung.
Du musst deine [m]simail.o[/m] neu kompilieren (auch mit [m]-m32[/m])
Deine [m]simail.o[/m] ist noch ein 64-Bit Objekt. [m]make clean[/m] hilft.
man 1 file
Ups, doofer Fehler
Jetzt klappt alles, danke für die Hilfe!