2011-10-23 16 views
7

Pytanie jest stosunkowo proste: w jaki sposób mogę zbudować GCC z serii 4.x (wraz z binutils i przyjaciółmi), który celuje w 2.4 ABI w tej samej architekturze co host kompilatora?Buduj nowoczesne (4.x) GCC, aby skierować jądro 2.4.x na tę samą architekturę co host?

System hosta to x86 lub x86_64, a jedynym wymaganiem jest, aby zbudowane pliki ELF działały na starym jądrze tak długo, jak długo pasuje ABI. (Źródła/nagłówki jądra istnieją)

Wymagana jest kompatybilna libc, aby ją połączyć. Mogę jednak również dynamicznie łączyć się z nią, ponieważ znam wersję (g) libc.

Wszelkie wskazówki będą mile widziane. Jestem trochę obeznany z crosstool-ng, ale to nawet nie obsługuje już jądra 2.4 (z oczywistych powodów).

+2

Z technicznego punktu widzenia, on patrzy, aby dowiedzieć się, jak kierować niższy ABI niż te stosowane przez większość nowoczesnych dystrybucjach, a otrzymasz odpowiednio niższa sekcja znacznika .ABI w pliku binarnym ELF. Nie mogę znaleźć informacji na ten temat w Internecie w dowolnym miejscu, więc domyślam się, że jest to dość specjalistyczna prośba. Być może chcesz wysłać e-mail na listę mailingową [email protected] –

+0

@Ken Bloom: dzięki. Dobry pomysł. Rzeczywiście nie mogłem znaleźć żadnych wskazówek, więc pomyślałem, że o to zapytam :) – 0xC0000022L

Odpowiedz

1

Prawdopodobnie najprostszym sposobem jest ustawienie nowoczesnego łańcucha narzędzi na starym systemie operacyjnym.

RHEL 2.1 lub 3 może być najlepszy, ponieważ były wspierane do niedawna.

Kompilowanie gcc 4 może być trudne, ponieważ będziesz potrzebować również bibliotek matematycznych. Może być konieczne podejście wieloetapowe.

EDIT:

Na kompilacji nowsze gcc:

  1. kompilacji najnowszej make - dodaj do PATH
  2. Rozpakuj gcc
  3. Rozpakuj mpfr, GMP RPP do gcc katalogu
  4. dowiązanie symboliczne wersjonowane katalogi do bazy (mpfr, gmp, mpc).
  5. zbudować i zainstalować gcc

coś takiego:

cd ~/software 
tar xjf $DOWNLOAD/gcc/gcc-core-${GCCVER}.tar.bz2 || failure "unpack gcc failed" 
tar xjf $DOWNLOAD/gcc/gcc-g++-${GCCVER}.tar.bz2 || failure "unpack g++ failed" 

cd gcc-${GCCVER} 

tar xjf $DOWNLOAD/gmp-5.0.2.tar.bz2 || failure "unpack gmp failed" 
#tar xjf $DOWNLOAD/gmp-4.3.2.tar.bz2 || failure "unpack gmp failed" 
ln -s gmp-* gmp 
tar xjf $DOWNLOAD/mpfr-2.4.2.tar.bz2 || failure "unpack mpfr failed" 
#tar xjf $DOWNLOAD/mpfr-2.4.2.tar.bz2 || failure "unpack mpfr failed" 
ln -s mpfr-* mpfr 
tar xzf $DOWNLOAD/mpc-0.9.tar.gz || failure "unpack mpc failed" 
ln -s mpc-* mpc 

cd .. 
mkdir gcc-build 
cd gcc-build 
../gcc-${GCCVER}/configure --prefix=/opt/tools || failure "configure failed" 
make || failure "make failed" 
make install || failure "install failed" 
+0

Niestety wydaje się, że jest to jedyna opcja. – 0xC0000022L

0

Sądzę, że prawdopodobnie powinieneś zbudować cross-kompilator GCC w tym przypadku, i że powinieneś skompilować GLibc, który poradziłby sobie z zależnością od starego jądra 2.4.

Czy próbowałeś jednak po prostu skompilować swój kod i po prostu połączyć go ze starą biblioteką Glibc kompatybilną z jądrem 2.4? Przypuszczam, że to powinno zadziałać.

Czy próbowałeś uruchomić swój plik binarny (otrzymałeś prostą metodę na ostatnim systemie używającym ostatniego GCC) w starym systemie? Co nie działa zgodnie z oczekiwaniami?

Pozdrawiam.

+0

Wbudowany kod binarny, po uruchomieniu, spowoduje błąd, że jądro jest zbyt stare. A raczej ładowacz to zrobi. – 0xC0000022L