PLD-doc: AMD64.txt (NEW)

Jakub Bogusz qboosh w pld-linux.org
Pią, 9 Sty 2004, 11:43:29 CET


On Fri, Jan 09, 2004 at 10:35:57AM +0100, jajcus wrote:
>     Z punktu widzenia przenoszenia oprogramowania istotne są następujące 
>     różnice:
> 
>       1. sizeof(long)=8, na x86: sizeof(long)=4. Co za tym idzie,
>          także size_t, time_t i parę innych typów jest 64-bitowych.
> 
>       2. sizeof(void *)=8, na x86: sizeof(void *)=4. To samo dla wszystkich
>          innych wskaźników.
> 
>       3. obiekty konsolidowane do bibliotek dzielonych _muszą_ być kompilowane
>          z opcją -fPIC. Możliwe że to tymczasowe ograniczenie linkera, ale
> 	 ta opcja i tak powinna być przy tworzeniu bibliotek dzielonych 
> 	 zawsze używana.
> 
>       4. aby w systemie z oprogramowaniem 64-bitowym można było korzystać
>          także z pakietów 32-bitowych biblioteki wrzucane są nie do /usr/lib,
> 	 ale do /usr/lib64. Patrz rozdział "/usr/lib64 czy /usr/lib?".

1-3 dotyczy także alphy.
3 przejściowo w niektórych przypadkach ppc (SEGV w binutils)
1,2 w przyszłości sparc64/ppc64/ia64
4 w przyszłości sparc64/ppc64

Może ten dokument napisać ogólniej, żeby nie kopiować dużych części?

>    4. Pliki dla biblioteki dzielonej kompilowane bez -fPIC.
>       
>       Objawia się to komunikatem błędu podczas konsolidacji:
>       "relocation R_X86_64_32S can not be used when making a
>       +shared object; recompile with -fPIC".

Na alphie komunikat jest bardziej enigmatyczny... i warto go gdzieś
opisać, bo mało kto wie, o co chodzi.
Brzmi "gp-relative relocation against dynamic symbol <nazwa>".

>       W takim przypadku należy się upewnić, że wszystkie pliki
>       które są konsolidowane do biblioteki dzielonej zostały skompilowane
>       z opcją -fPIC. Najprostszym rozwiązaniem (ale często nie najlepszym)
>       jest dodanie -fPIC do CFLAGS przekazywanego do %configure.

Porządniej - zwykle używać noinst_LTLIBRARIES zamiast noinst_LIBRARIES;
unikać -static czy -prefer-non-pic tam, gdzie budowane są biblioteki lub
moduły dzielone.

>     Obecnie chyba prawidłowo zrobiony jest Tcl i Ruby. Tcl nauczony jest
>     szukać swoich pakietów zarówno w /usr/lib64 i w /usr/lib. Trzeba tylko
>     zadbać żeby pakiety te, zależnie od tego czy są binarne, czy nie, trafiały
>     do odpowiedniego katalogu. Ruby trzyma swoją standardową bibliotekę
>     w /usr/lib64/ruby/, a dodatkowe moduły wrzucane są do /usr/lib/ruby/.
>     Problemu z /usr/lib/ruby/ nie ma, bo binarne moduły zbudowane dla
>     architektur 32-bitowych trafiają do innego podkatalogu niż te dla AMD64.
>     Perlowi i Pythonowi trzeba się jeszcze przyjrzeć.

Aktualnie dzięki Radkowi Perl wrzuca moduły noarch do /usr/share/perl5,
a zależne od architektury do /usr/lib/perl5 - jeśli w tym drugim
przypadku zamiast lib pochodzi z %{_lib}, to jest OK.


-- 
Jakub Bogusz    http://cyber.cs.net.pl/~qboosh/



Więcej informacji o liście dyskusyjnej pld-devel-pl