C/Więcej o kompilowaniu: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
m poprawa linków
T ziel (dyskusja | edycje)
Nie podano opisu zmian
Linia 20:
reguły...
 
Dzięki temu program make zna już kolejność wykonywanych działań oraz czynności, jakie ma wykonać. Aby zbudowaczbudować "co" należy wykonać polecenie: <tt>make co</tt>. Pierwsza reguła w pliku Makefile jest regułą domyślną. Jeśli wydamy polecenie <tt>make</tt> bez parametrów, zostanie zbudowana właśnie reguła domyślna. Tak więc dobrze jest jako pierwszą regułę wstawić regułę budującą końcowy plik wykonywalny; zwyczajowo regułę tą nazywa się <tt>all</tt>.
 
Należy pamiętać, by sekcji "co" nie wcinać, natomiast "reguły" wcinać dwoma spacjami. Część "od_czego" może być pusta.
Linia 65:
rm -f *.o test
 
Ta reguła spodowujespowoduje usunięcie wszystkich plików .o oraz naszego programu jeśli napiszemy <tt>make clean</tt>.
 
Możemy też ukryć wykonywane komendy albo dopisać własny opis czynności:
Linia 106:
__attribute__ ((packed))
 
Dzięki użyciu tego atrybutu, kompilator zostanie "zmuszony" do braku ingerencji w naszą strukturę. Jest jednak jeszcze jeden, być może bardziej elegancki sposób na obejście dopełniania. Zauważyłeś, że dopełnienie, dodane przez kompilator pojawiło się między polem o długości 8-bitów (plec) oraz polem o długości 32-bitów (dochod). Wyrównywanie polega na tym, że dana zmienna powinna być umieszczona pod adresem będącym wielokrotnością jej rozmiaru. Oznacza to, że jeśli np. mamy w strukturze na początku dwie zmienne, o rozmiarze jednego bajta, a potem jedną zmienną, o rozmiarze 4 bajtów, to pomiędzy polami o rozmiarze 2 bajtów, a polem czterobajtowym pojawi się dwubajtowe dopełnienie. Może Ci się wydawać, że jest to tylko niepotrzebne mącenie w głowie, jednak niektóre architektury (zwłaczazwłaszcza typu [[w:RISC|RISC]]) mogą nie wykonać kodu, który nie został wyrównany. Dlatego, naszą strukturę powinniśmy zapisać mniej więcej tak:
typedef struct {
Linia 116:
W ten sposób wyrównana struktura nie będzie podlegała modyfikacjom przez kompilator oraz będzie przenośna pomiędzy różnymi kompilatorami.
 
Wyrównywanie działa także na pojedyczychpojedynczych zmiennych w programie, jednak ten problem nie powoduje tyle zamieszania, co ingerencja kompilatora w układ pól struktury. Wyrównywanie zmiennych polega tylko na tym, że kompilator umieszcza je pod adresami, które są wielokrotnością ich rozmiaru
 
== Kompilacja skrośna ==
Linia 122:
 
== Inne narzędzia ==
Wśród przydatnych narzędzi, warto wymienić równierzrównież program objdump (zarówno pod Unix jak i pod Windows) oraz readelf (tylko Unix). Objdump służy do deasemblacji i analizy skompilowanych programów. Readelf służy do analizy pliku wykonywalnego w formacie ELF (używanego w większości systemów z rodziny Unix). Więcej informacji możesz uzyskać, pisząc (w systemach Unix):
 
man 1 objdump