downloadDownload FAQFAQ
Site Navigation:
 
 

12. Rozwój

Ta sekcja dotyczy różnych aspektów i narzędzi deweloperskich

12.1. Środowisko

Są nowe możliwości w glibc:

  • Wsparcie dla

    • Mutex-y dziedziczenia priorytetów (priority inheriting mutexes) automatycznie zapobiegają odwróceniu priorytetów spowodowanym przez czekanie na dostępność mutex-ów. Kernel automatycznie podnosi priorytety wątku obsługującego mutex dopóki nie odblokuje mutex-u.

    • Ochrona priorytetów pozwala na określenie priorytetu, który będą uruchamiały wszystkie wątki, które pozyskują mutex, dopóki ten mutex nie zostanie odblokowany. Ta opcja nie jest dostępna dla potężnych mutex-ów.

  • Sortowanie adresu przeznaczenia wykonywane przez interfejs getaddrinfo() do sprawdzania nazwy hosta może być teraz dostosowane przez reguły w pliku /etc/gai.conf.

  • Znaczące wzrosty prędkości w procesowaniu NIS i NIS+

  • Ukończone wsparcie RFC 3542 (zaawansowane gniazdowe API dla IPv6)

  • Znaczące wzrosty prędkości dynamicznego sprawdzania symboli

12.2. Narzędzia

Likner zawiera wsparcie dla nowego formatu tabeli symboli hash ELF. Użyj opcji --hash-style linkera aby wybrać te(n) format(y).

12.2.1. Pliki nagłówkowe kernela

To wydanie Fedory Core zostało zbudowane przy użyciu nagłówków kernela zaeksportowanych bezpośrednio z kernela, przy użyciu opcji headers_install kernela 2.6.18. To znaczy, że pakiet glibc-kernheaders został usunięty i zastąpiony przez kernel-headers, podpakiet kernel.

Deweloperzy mogą zauważyć pewne zmiany pomiędzy tymi nowymi nagłówkami kernela i tym, co było wcześniej, włączając ale nie ograniczając następujących:

  • Plik nagłówkowy <linux/compiler.h> został usunięty, bowiem nie zawiera nic do użycia w przestrzeni użytkownika.

  • Makra _syscallX() zostały usunięte. Przestrzeń użytkownika powinna zamiast tego używać syscall() z biblioteki C.

  • Makro PAGE_SIZE zostało usunięte z niektórych architektór, bowiem rozmiar strony jest zmienny. Przestrzeń użytkownika powinna zamiast tego używać sysconf(_SC_PAGE_SIZE) lub getpagesize().

  • Zostały usunięte pliki nagłówkowe <asm/atomic.h> i <asm/bitops.h>. Nie były one przeznaczone do użytku w przestrzeni użytkownika, a ich kompilacja nie powiodłaby się na niektórych architekturach, podczas wykazywania nie-atomicznego (non-atomic) zachownia na innych. Kompulator C dostarcza własnych wbudowanych funkcji atomicznych, odpowiednich do użycia w zamian w programach przestrzeni użytkownika.

  • Treść, która była poprzednio chroniona przez #ifdef __KERNEL__ jest teraz całkowicie opuszczona z narzędziem unifdef. Definiowanie __KERNEL___ w celu zobaczenia części, które nie powinny być widoczne dla przestrzeni użytkownika nie jest już efektywne.

W dodatku, niektóre inne pliki nagłówkowe, które są niewłaściwe do użytku w przestrzeni użytkownika zostały usunięte, oraz jeszcze więcej nagłówków zostało wyedytowanych w celu usunięcia niewłaściwej treści.

[Notatka]Zmiany nagłówków kernela nie są specyficzne dla Fedory

Te zmiany są odziedziczone z głównego kernela i nie są specyficzne dla Fedory. Każda dystrybicja używająca aktualnego oficjalnie zaeksportowanych nagłówków kernela będzie pod tym względem taka sama.

12.2.2. Kolekcja Kompilatora GCC

To wydanie Fedory Core zostało zbudowane przy użyciu GCC 4.1, które jest włączone w dystrybucję.

12.2.2.1. Ostrzeżenia
  • Deweloperzy Fedory przedstawili zmiany w sekcji ELF .hash, które dostarczają symboli do dynamicznego linkowania. Ta nowa sekcja .gnu.hash, która została stworzona z nową domyślną opcją --hash-style=gnu dla gcc, dostarcza to samo, co poprzednie sekcje hash. Jednakże, zapewnia około 50% wzrost prędkości przy dynamicznym linkowaniu. Binaria i biblioteki stworzone z tą nową funkcją hashującą są niekompatybilne ze starszym glibc i wydaniami dynamicznego linkera. Aby użyć starych zwyczajów hashowania dla kompatybilności ze starszymi systemami bazowanymi na glibc, wpisz zamiast tego opcję --hash-style=sysv.

  • Potrzebujesz GDB 6.1 lub nowszego aby debugować binaria, jeżeli nie są one skompilowane z wykorzystaniem opcji kompilacji -fno-var-tracking.

  • Opcja -fwritable-strings nie jest już akceptowana.

  • Angielskie wiadomości diagnostyczne mogą teraz używać cytatów Unicode. Jeśli nie możesz tego przeczytać, ustaw swoją zmienną środowiskową LC_CTYPE na C, lub zmień Twój emulator terminala.

  • Plik specs nie jest już instalowany na większości systemów. Zwykli użytkownicy nic nie odczują, ale deweloperzy, którzy potrzebują zmienić ten plik mogą użyć opcji -dumpspecs w celu wygenerowania go do edycji.

12.2.2.2. Generacja Kodu
  • Optymalizador kody SSA jest teraz dołączony i zapewnia lepszą propagację zmiennych, częściową redukcję rezerwy, ładuje i przechowuje ruch kodu, redukcję siły, eliminację martwej pamięci, lepszą detekcją nieosiągalnego kodu, oraz rekursję reszty poprzez akumulację.

  • Jest wspierana autowektoryzacja. Ta technika osiąga wyższą wydajność dla powtarzalnego kodu pętlowego, w pewnych warunkach.

12.2.2.3. Rozszerzenia Językowe
  • Nowy atrybut strażnika powoduje, ze kompilator zgłasza ostrzeżenie, jeśli funkcjia jak execl(char *path, const char *arg, ...), która wymaga terminatora listy NULL, nie posiada NULL.

  • Rozszerzenia cast-as-lvalue, conditional-expression-as-lvalue, oraz compund-expression-as-lvalue zostały usnięte.

  • Semantyki #pragma pack() są teraz bliższe tym używanym przez inne kompilatory.

  • Pobieranie adresu zmiennej zadeklarowanej z modyfikatorem rejestru generuje teraz błąd zamiast ostrzeżenia.

  • Przestrzenie niekompletnych wpisów elementów generują teraz błąd. To powoduje wyłączenie dalszej referencji do definicji struktury.

  • Podstawowy kompilator, bez żadnej optymizacji (-O0), został określony jako 25% szybszy w realnym kodzie (real-world code).

  • Biblioteki mogą teraz staryczne zmienne powiększające funkcje w programach wielowątkowych. Zatwardziali deweloperzy mogą użyć -fno-threadsafe-statics, ale zwykli użytkownicy nigdy nie powinni tego robić.

12.3. Ruby

Standardowa ścieżka przeszukiwania dla bibliotek Ruby, $:, została zmieniona zgodnie z tymi dyrektywami paczkowania. Zmiany zostały dokonane również w niektórych wpisach w Config::CONFIG w module rbconfig. Najważniejsze zmiany, to:

  • sitedir oraz powiązane katalogi (sitelibdir, sitearchdir) są teraz w rubylibdir. Zamiast /usr/lib/site_ruby są w /usr/lib/ruby/site_ruby.

  • Katalogi niezależnego od architektury czystego Ruby zawsze są w /usr/lib, nawet na architekturze x86_64, gdzie zwykły być w /usr/lib64. Ta zmiana dotyczy Config::CONFIG wpisów rubylibdir oraz sitelibdir.

Katalogi, które były wcześniej w $: pozostają tam , żeby istniejący kod, jak na przykład /usr/lib/site_ruby, nie potrzebował modyfikacji. Te katalogi są jednak przestarzałe i będą usunięte w Fedorze Core 8. Pakiety budowania RPM Ruby są zgodne z tymi dyrektywami paczkowania. Zwłaszcza biblioteki Ruby powinny być instalowane tylko do sitelibdir oraz sitearchdir. Powinieneś również przestrzegac tej zasady dla kodu Ruby, który nie jest spaczkowany jako RPM.