mplayer problem
Giorgos Keramidas
keramida at ceid.upatras.gr
Fri Nov 25 21:16:53 EET 2005
On 2005-11-25 18:23, "P. Christeas" <p_christ at hol.gr> wrote:
> Ίσως αν και το binary του mplayer ήταν 32-bit, να έπαιζε με τα
> codecs. Αλλά στο Linux, όταν μιλάμε για 64-bit εννοούμε να παίζουν
> όλες οι εφαρμογές στα 64.
Με λίγο προσπάθεια γίνονται και τα δύο. Αρκεί να έχεις τις
απαραίτητες runtime libraries τόσο σε 32-bit όσο και σε 64-bit
binaries. Στο Solaris αυτό γίνεται βάζοντας τις 32-bit libs στο
/usr/lib και τις 64-bit libs στο /usr/lib/64. Στο FreeBSD που
μπορώ να δοκιμάσω άμεσα εδώ πέρα, το ίδιο πράγμα γίνεται με τις
'native' βιβλιοθήκες στο /usr/lib (32-bit σε i386, 64-bit σε
amd64) και ειδικά για τα 64-bit amd64 συστήματα υπάρχει το
/usr/lib32 με τις 32-bit runtime compatibility libs.
Αρα γίνεται αυτό που λες. Ενα εξαιρετικά απλό παράδειγμα, με
χρήση της επιλογής -m32 και -B του gcc φαίνεται παρακάτω.
Πριν μου πει κανείς "τι λε ρε φιλαράκι, εγώ δεν αγόρασα το
σούπερ-ντούπερ 64-bit γαϊδούρι για να τρέχω τα ίδια 32-bit
binaries", δε με νοιάζει. Μέχρι να μπορούμε να τρέξουμε ΟΛΑ τα
προγράμματα σε 64-bit builds, λίγη συμβατότητα δεν είναι άσχημη :-)
Sources
*******
flame:/tmp/foo$ cat -n Makefile
1 PROG= foo
2 NO_MAN= If you need a manpage for this, something's wrong.
3
4 WARNS?= 6
5
6 .include <bsd.prog.mk>
flame:/tmp/foo$ cat -n foo.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int
5 main(void)
6 {
7
8 printf("Hello world\n");
9 return EXIT_SUCCESS;
10 }
flame:/tmp/foo$
64-bit πρόγραμμα σε 64-bit σύστημα
**********************************
Χωρίς ιδιαίτερες παραμέτρους, παρά μόνο με αυτές που ενεργοποιεί
το WARNS=6 make var για τα standard FreeBSD builds, το binary που
δημιουργείται και τρέχει είναι 64-bit ELF για AMD:
flame:/tmp/foo$ make clean all
rm -f foo foo.o
Warning: Object directory not changed from original /tmp/foo
cc -Wsystem-headers -Werror -Wall \
-Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes \
-Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \
-Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wunused-parameter \
-Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls \
-c foo.c
cc -Wsystem-headers -Werror -Wall \
-Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes \
-Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \
-Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wunused-parameter \
-Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls \
-o foo foo.o
flame:/tmp/foo$ file foo
foo: ELF 64-bit LSB executable, AMD x86-64, version 1 (FreeBSD), \
dynamically linked (uses shared libs), not stripped
flame:/tmp/foo$ ./foo
Hello world
flame:/tmp/foo$
32-bit πρόγραμμα στο ίδιο 64-bit σύστημα
****************************************
Με προσθήκη 2 μόνο options στο environment του build, το binary
που δημιουργείται είναι 32-bit i386.
Τα options έχουν γίνει wrap στο ίδιο σημείο, για να φαίνεται ότι
η μόνη διαφορά είναι βασικά τα έξτρα CFLAGS που περνάω στο
environment του make(1) την ώρα της μεταγλώττισης.
flame:/tmp/foo$ env CFLAGS='-m32 -B/usr/lib32' make clean all
rm -f foo foo.o
Warning: Object directory not changed from original /tmp/foo
cc -m32 -B/usr/lib32 \
-Wsystem-headers -Werror -Wall \
-Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes \
-Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \
-Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wunused-parameter \
-Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls \
-c foo.c
cc -m32 -B/usr/lib32 \
-Wsystem-headers -Werror -Wall \
-Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes \
-Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \
-Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wunused-parameter \
-Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls \
-o foo foo.o
flame:/tmp/foo$ file foo
foo: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), \
dynamically linked (uses shared libs), not stripped
flame:/tmp/foo$ ./foo
Hello world
flame:/tmp/foo$
More information about the Linux-greek-users
mailing list