*.o Vorgabe Dateien auch für x86

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 :frowning:
Vielleicht gibt es einen guten Grund das nicht zu tun, daher wär mir ein Statement ganz lieb :slight_smile:


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.


Falls du unter Ubuntu bist, brauchst du das Paket 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 :slight_smile:
Jetzt klappt alles, danke für die Hilfe!