Nowe posty

Autor Wątek: [GCC] Kompilacja pod daną architekturę  (Przeczytany 7594 razy)

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 27
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« dnia: 2009-08-20, 12:23:01 »
W jaki sposób kompiluje się programy pod daną architekturę komputera?

Ja mam architekture i686:
bash-3.1$ arch
i686
A mimo to program po kompilacji jest dla architektury i386:
bash-3.1$ objdump main -R      

main:     file format elf32-i386
Dlaczego tak jest i jak mogę to zmienić?

Offline Piotr Chmura

  • Administrator
  • Guru
  • *****
  • Wiadomości: 5060
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #1 dnia: 2009-08-20, 12:35:08 »
Poczytaj o flagach kompilatora gcc, w szczególności interesuje cię flaga march

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 27
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #2 dnia: 2009-08-20, 12:56:34 »
Dzięki za odp, ale dalej mam problem:
bash-3.1$ CFLAGS="-march=i686"
bash-3.1$ CXXFLAGS=$CFLAGS
bash-3.1$ CPPFLAGS=$CFLAGS
bash-3.1$ declare | grep FLAGS
CFLAGS=-march=i686
CPPFLAGS=-march=i686
CXXFLAGS=-march=i686
bash-3.1$ g++ -o main main.cpp
bash-3.1$ objdump -R main

main:     file format elf32-i386
Nie działa nawet w ten sposób:
bash-3.1$ g++ -march=i686 -o main main.cpp 
bash-3.1$ objdump -R main                  

main:     file format elf32-i386
Czemu cały czas jest i386?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 2608
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
    • keybase.io/pkraszewski
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #3 dnia: 2009-08-20, 22:16:29 »
Zapis "elf32-i386" oznacza 32 bitowy plik w formacie ELF na architekturę IA-32. To nie jest istotne, czy jest to kompilowane na 386SX czy Core i9 - w trybie 32 bitowym plik jest typu elf32-i386. Tak samo niezależnie od tego czy 64-bitowy plik jest optymalizowany na AMD64 czy na Core2, to jest typu elf64-x86-64.

Flaga -march=i686 instruuje procesor co do typu wymaganych przez dany procesor optymalizacji. Optymalizacja nie ma wpływu na typ pliku ELF tylko na jego zawartość.

To trochę jak kartka A4 zapisana chińskimi znakami i druga polskimi. Niby obie są typu A4, ale zoptymalizowane pod zupełnie innych użytkowników.
Paweł Kraszewski
~Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 27
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #4 dnia: 2009-08-20, 23:10:09 »
Dzięki chyba rozumiem, ale mam jeszcze 2 pytania.

1. Skoro objdump -R nie pokazuje pod jaki procesor skompilowany jest program, to w jaki sposób to sprawdzić?

2. Załóżmy, że skompiluje swój program z flagą -march=i686 a następnie utworze z niego paczkę dla danej dystrybucji.
Jak wiadomo taką paczkę nazywa się:
nazwa_programu-wersja-architektura-wydanie.tgz

Czy dzieki podaniu flagi march mogę już w miejscu architektury podać i686, czy może trzeba coś jeszcze ustawić?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 2608
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
    • keybase.io/pkraszewski
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #5 dnia: 2009-08-20, 23:45:00 »
Ad 1. Celne pytanie. Przypadek ogólny - nie da się. Jak działa, to optymalizacja jast na procesor nie lepszy niż Twój. Większość aplikacji 32 bitowych obecnie kompilowana jest na i686, czyli na Pentium Pro. Jak w programie zostawisz informacje debuggera, to wśród nich są użyte flagi kompilatora, ergo informacje o docelowym procesorze.

Ad 2. Czemu napierasz się na i686? Architektura nazywa się i386, albo inaczej IA-32 (to to samo) - koniec, kropka. Architektura 64-bitowa nazywa się AMD64, EM64T bądź x86-64 (to znowu to samo, odpowiedno w świecie AMD, Intela i "neutralne światopoglądowo"). W ramach architektury i386 masz rodziny 386, 486, Pen=586, P Pro=686, P 4, Core, itd. Niefortunną sprawą jest to, że architektura i386 nazywa się tak, jak jeden z jej przedstawicieli. Tak samo posiadacze Core2/i7/i9 nie mogą przełknąć, że wszędzie programy dla nich występują jako architerktura amd64. Możesz więc mieć program w architekturze amd64 skompilowany na rodzinę i7, tak samo jak program w architekturze i386 skompilowany na rodzinę Pentium4.

Ad 3. Tak.
Paweł Kraszewski
~Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 27
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #6 dnia: 2009-08-21, 12:02:18 »
Dzięki, ostatnie pytanie:
Jak ustawię CFLAGS="-march=i686" i CPPFLAGS=$CFLAGS w /etc/profile, to wszystkie programy, które kompiluję poleceniem make też będą zoptymalizowane pod i686?

Bo zrobiłem sobie taki test i jak napisałem:
g++ -march=i123 main.cpp
to wyskoczyło mi, ze nie ma takiej architektury a jak ustawiłem te zmienne środowiskowe a potem wpisałem samo:
g++ main.cpp

To żaden błąd się nie pojawia i nie jestem pewien, czy dobrze to robię.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 2608
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
    • keybase.io/pkraszewski
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #7 dnia: 2009-08-21, 13:04:46 »
Nie robisz dobrze.

Jak dokładnie popatrzysz w treść makefilów (na bazie których pewnie strugasz konfigurację) to znajdziesz linijkę podobną do

$(CC) $(CFLAGS) ......................
,czyli zmienne środowiskowe C**FLAGS czytane i wstawiane są przez make a nie przez sam kompilator. Potrzebujesz odpalać kompilator przez
g++ $CPPFLAGS main.cpp
żeby zadziałało po twojemu. Albo zdefiniować aliasa go g++ z flagami. Albo zrobić skrypty wrappera. Albo zrobic plik Make. Ostatnie szczerze polecam, daje największe możliwości.
Paweł Kraszewski
~Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 27
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #8 dnia: 2009-08-21, 13:55:48 »
No dobra, próbowałem w takim razie skompilować najnowszego pidgina z opcją -march=i686.
Ustawiłem zmienne środowiskowe, uruchomiłem ./configure, a potem make > log.txt, żeby móc potem zobaczyc jak przebiegła kompilacja.
Niestety okazało sie, że wszędzie w pliku log.txt gdzie występuje opcja march, jest ona z opcją i486 a nie i686.

Otworzyłem więc plik Makefile i zmieniłem:
CFLAGS = -g -g -O2 na  CFLAGS = -march=i686 -g -g -O2
a także
CPPFLAGS = na CPPFLAGS = -march=i686

Ale to też nic nie dało, cały czas w pliku log.txt pojawiaja mi się takie wpisy:
Cytuj
gcc -c  -I. -I. -I../../../.. -I../../../../libpurple -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib/perl5/5.10.0/i486-linux-thread-multi/CORE  -g -g -O2 -O2 -march=i486 -mtune=i686   -DVERSION=\\"0.01\\" -DXS_VERSION=\\"0.01\\" -fPIC "-I/usr/lib/perl5/5.10.0/i486-linux-thread-multi/CORE"  -Wall  -DPURPLE_DISABLE_DEPRECATED -DPIDGIN_DISABLE_DEPRECATED -DFINCH_DISABLE_DEPRECATED -DGNT_DISABLE_DEPRECATED -Waggregate-return -Wcast-align -Wdeclaration-after-statement -Wendif-labels -Werror-implicit-function-declaration -Wextra -Wno-sign-compare -Wno-unused-parameter -Wformat-security -Winit-self -Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes -Wpointer-arith -Wundef -Wp,-D_FORTIFY_SOURCE=2 Account.c
/usr/bin/perl5.10.0 /usr/lib/perl5/5.10.0/ExtUtils/xsubpp  -typemap /usr/lib/perl5/5.10.0/ExtUtils/typemap -typemap typemap  AccountOpts.xs > AccountOpts.xsc && mv AccountOpts.xsc AccountOpts.c
gcc -c  -I. -I. -I../../../.. -I../../../../libpurple -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib/perl5/5.10.0/i486-linux-thread-multi/CORE  -g -g -O2 -O2 -march=i486 -mtune=i686   -DVERSION=\\"0.01\\" -DXS_VERSION=\\"0.01\\" -fPIC "-I/usr/lib/perl5/5.10.0/i486-linux-thread-multi/CORE"  -Wall  -DPURPLE_DISABLE_DEPRECATED -DPIDGIN_DISABLE_DEPRECATED -DFINCH_DISABLE_DEPRECATED -DGNT_DISABLE_DEPRECATED -Waggregate-return -Wcast-align -Wdeclaration-after-statement -Wendif-labels -Werror-implicit-function-declaration -Wextra -Wno-sign-compare -Wno-unused-parameter -Wformat-security -Winit-self -Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes -Wpointer-arith -Wundef -Wp,-D_FORTIFY_SOURCE=2 AccountOpts.c
/usr/bin/perl5.10.0 /usr/lib/perl5/5.10.0/ExtUtils/xsubpp  -typemap /usr/lib/perl5/5.10.0/ExtUtils/typemap -typemap typemap  BuddyIcon.xs > BuddyIcon.xsc && mv BuddyIcon.xsc BuddyIcon.c
gcc -c  -I. -I. -I../../../.. -I../../../../libpurple -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib/perl5/5.10.0/i486-linux-thread-multi/CORE  -g -g -O2 -O2 -march=i486 -mtune=i686   -DVERSION=\\"0.01\\" -DXS_VERSION=\\"0.01\\" -fPIC "-I/usr/lib/perl5/5.10.0/i486-linux-thread-multi/CORE"  -Wall  -DPURPLE_DISABLE_DEPRECATED -DPIDGIN_DISABLE_DEPRECATED -DFINCH_DISABLE_DEPRECATED -DGNT_DISABLE_DEPRECATED -Waggregate-return -Wcast-align -Wdeclaration-after-statement -Wendif-labels -Werror-implicit-function-declaration -Wextra -Wno-sign-compare -Wno-unused-parameter -Wformat-security -Winit-self -Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes -Wpointer-arith -Wundef -Wp,-D_FORTIFY_SOURCE=2 BuddyIcon.c
/usr/bin/perl5.10.0 /usr/lib/perl5/5.10.0/ExtUtils/xsubpp  -typemap /usr/lib/perl5/5.10.0/ExtUtils/typemap -typemap typemap  BuddyList.xs > BuddyList.xsc && mv BuddyList.xsc BuddyList.c
gcc -c  -I. -I. -I../../../.. -I../../../../libpurple -pthread -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include   -D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib/perl5/5.10.0/i486-linux-thread-multi/CORE  -g -g -O2 -O2 -march=i486 -mtune=i686   -DVERSION=\\"0.01\\" -DXS_VERSION=\\"0.01\\" -fPIC "-I/usr/lib/perl5/5.10.0/i486-linux-thread-multi/CORE"  -Wall  -DPURPLE_DISABLE_DEPRECATED -DPIDGIN_DISABLE_DEPRECATED -DFINCH_DISABLE_DEPRECATED -DGNT_DISABLE_DEPRECATED -Waggregate-return -Wcast-align -Wdeclaration-after-statement -Wendif-labels -Werror-implicit-function-declaration -Wextra -Wno-sign-compare -Wno-unused-parameter -Wformat-security -Winit-self -Wmissing-declarations -Wmissing-noreturn -Wmissing-prototypes -Wpointer-arith -Wundef -Wp,-D_FORTIFY_SOURCE=2 BuddyList.c
/usr/bin/perl5.10.0 /usr/lib/perl5/5.10.0/ExtUtils/xsubpp  -typemap /usr/lib/perl5/5.10.0/ExtUtils/typemap -typemap typemap  Certificate.xs > Certificate.xsc && mv Certificate.xsc Certificate.c
Jak widać wszędzie -march=i486 :/

Co robię źle?

Offline

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 258
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #9 dnia: 2009-08-21, 18:55:03 »
Taka mała wskazówka:
To, że zedytujesz plik Makefile w katalogu głównym źródeł nie znaczy, że zmienią się pliki Makefile w poszczególnych podkatalogach używanych do budowania danej aplikacji.

Offline

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 27
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #10 dnia: 2009-08-21, 19:09:14 »
No to nie wiem już jak mam to skompilować :(

Zobaczcie sami:
$ ./configure --help

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

(...)
Więc wszystko powinno być ok po ustawieniu zmiennych środowiskowych.

Offline arctgx

  • Users
  • Guru
  • *****
  • Wiadomości: 2753
    • Zobacz profil
[GCC] Kompilacja pod daną architekturę
« Odpowiedź #11 dnia: 2009-08-21, 21:34:49 »
U siebie do CFLAGS mam dodane "-mtune=athlon-xp". Niestety, nie rzeczowo nie uzasadnię Ci czy i dlaczego opcja ta rzeczywiście wykorzystuje instrukcje specyficzne dla mojego Semprona 2200+ (i odpowiednio, inna wartość dla Twojego sprzętu).

Przy okazji próby nabrania większej świadomości używania żywcem zerżniętych wskazówek, trafiłem na skrypt sugerujący pewien zbiór flag, zależnie od, bodajże, systemu i procka (nie wnikałem w niego zbyt szczegółowo, ale może wyniki mojego płytkiego kopania dadzą chociaż jakiś namiar ;)):

http://www.pixelbeat.org/ scripts/gcccpuopt (uwaga: ze względu na cenzurę, adres ten trzeba skleić do kupy, tzn. spację wywalić...)
Użytkownik: Ib5sXfcCkvYR
Hasło: adam