Jump to content

LFS: Compile Cross-toolchain: Difference between revisions

From Haidhi Wiki
No edit summary
 
(9 intermediate revisions by the same user not shown)
Line 31: Line 31:
make
make
make install
make install
</syntaxhighlight>
= GCC-14.2.0 =
GCC membutuhkan tiga pustaka penting sebagai dependensi utama, yaitu GMP, MPFR, dan MPC. Ketiga pustaka ini digunakan untuk mendukung perhitungan aritmatika presisi tinggi yang diperlukan dalam proses kompilasi. Karena tidak semua sistem host (distro Linux) secara default menyertakan versi yang kompatibel dari pustaka-pustaka ini, maka langkah aman dan direkomendasikan adalah membangunnya secara langsung bersamaan dengan GCC. Untuk itu, setiap arsip sumber dari GMP, MPFR, dan MPC perlu diekstrak ke dalam direktori sumber GCC, lalu direktori hasil ekstraksi tersebut di-rename sesuai yang dikenali oleh sistem build GCC. Dengan cara ini, sistem build GCC secara otomatis akan mendeteksi dan mengintegrasikan pustaka-pustaka tersebut ke dalam proses kompilasi, tanpa perlu konfigurasi tambahan. Langkah ini juga memastikan konsistensi versi dan kompatibilitas penuh antara GCC dan dependensinya selama pembangunan toolchain LFS.
<syntaxhighlight lang=bash>
tar -xf ../mpfr-4.2.1.tar.xz
mv -v mpfr-4.2.1 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc
</syntaxhighlight>
Jika host pakai x86_64
<syntaxhighlight lang=bash>
case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
;;
esac
</syntaxhighlight>
Sekarang untuk compile GCC
<syntaxhighlight lang=bash>
mkdir -v build
cd      build
../configure                  \
    --target=$LFS_TGT        \
    --prefix=$LFS/tools      \
    --with-glibc-version=2.41 \
    --with-sysroot=$LFS      \
    --with-newlib            \
    --without-headers        \
    --enable-default-pie      \
    --enable-default-ssp      \
    --disable-nls            \
    --disable-shared          \
    --disable-multilib        \
    --disable-threads        \
    --disable-libatomic      \
    --disable-libgomp        \
    --disable-libquadmath    \
    --disable-libssp          \
    --disable-libvtv          \
    --disable-libstdcxx      \
    --enable-languages=c,c++
</syntaxhighlight>
compile
<syntaxhighlight lang=bash>
make
make install
</syntaxhighlight>
Setelah selesai jalankan command
<syntaxhighlight lang=bash>
cd ../
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h
</syntaxhighlight>
Command ini membuat file <code>limits.h</code> versi lengkap, lalu menaruhnya di direktori internal GCC, supaya GCC bisa mengenali batasan (limit) sistem secara utuh, walaupun sistem target-nya (LFS) belum punya Glibc lengkap. Hal ini dilakukan karena Saat ini, <code>limits.h</code> yang lengkap belum tersedia, karena glibc belum dibangun. GCC butuh header ini untuk meng-compile Glibc dan program lain nantinya. Kalau header ini tidak lengkap GCC bisa error atau compile-nya tidak optimal.
= Linux-6.13.4 API Headers =
Sebelum sistem bisa membangun pustaka C standar (Glibc), kernel Linux perlu menyediakan Application Programming Interface (API) berupa header file C yang bersih dan sesuai standar. Header-header ini digunakan Glibc agar dapat berkomunikasi dengan kernel, dan memastikan fungsi-fungsi dasar sistem seperti syscall bisa berjalan dengan benar. Header ini diambil dari source code kernel Linux, lalu disanitasi dan dipasang di direktori target agar Glibc bisa menggunakannya sebagai referensi saat dikompilasi.
<syntaxhighlight lang=bash>
make mrproper
make headers
find usr/include -type f ! -name '*.h' -delete
cp -rv usr/include $LFS/usr
</syntaxhighlight>
= Glibc-2.41 =
Glibc (GNU C Library) adalah library inti yang dipakai hampir semua program di Linux. Isinya fungsi-fungsi dasar seperti:
*alokasi memori (malloc, free),
*buka/tutup file,
*operasi string (strlen, strcpy, dll),
*input/output,
*matematika dasar, dll.
Pertama-tama adalah membuat symbolic link untuk LSB (Linux Standard Base). Intinya, kita bikin symbolic link ke dynamic linker (ld-linux-x86-64.so.2) yang nanti Glibc bangun, supaya program-program bisa menemukan loader itu di tempat yang umum. Untuk arsitektur x86_64, symbolic link ke loader (ld-linux-x86-64.so.2) juga bikin sistem bisa jalanin program ELF 64-bit dengan benar. Ini bukan cuma soal kompatibilitas — ini syarat supaya semua binary nanti bisa jalan.
<syntaxhighlight lang=bash>
case $(uname -m) in
    i?86)  ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
    ;;
    x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
    ;;
esac
</syntaxhighlight>
Glibc default-nya nyimpen data runtime di /var/db (yang non-standar). Padahal FHS nyaranin kita naruh data runtime di tempat seperti <code>/var/cache</code> dan <code>/var/lib</code>
Makanya kita apply patch supaya Glibc gak nyimpang dari standar struktur direktori Linux.
<syntaxhighlight lang=bash>
patch -Np1 -i ../glibc-2.41-fhs-1.patch
</syntaxhighlight>
Lalu selanjutnya
<syntaxhighlight lang=bash>
mkdir -v build
cd      build
# memastikan sln dan ldconfig terinstall di /usr/sbin
echo "rootsbindir=/usr/sbin" > configparms
../configure                            \
      --prefix=/usr                      \
      --host=$LFS_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=5.4                \
      --with-headers=$LFS/usr/include    \
      --disable-nscd                    \
      libc_cv_slibdir=/usr/lib
make
make DESTDIR=$LFS install #DESTDIR=$LFS memastikan kalau package terisntall di $LFS, bukan di root (/)
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
</syntaxhighlight>
Sebelum melangkah ke tahap selanjutnya, pastikan bahwa package yang kita install selama ini berfungsi dengan baik, caranya:
<syntaxhighlight lang=bash>
echo 'int main(){}' | $LFS_TGT-gcc -xc -
readelf -l a.out | grep ld-linux
</syntaxhighlight>
kalau outputnya:
<syntaxhighlight lang=bash>
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
</syntaxhighlight>
berati instalasi telah benar. Setelah itu bersihkan test file dengan menjalankan command <code>rm -v a.out</code>
= Libstdc++ from GCC-14.2.0 =
Libstdc++ adalah library standar untuk bahasa C++ yang disediakan oleh GCC. Kenapa gak langsung dibuild di GCC Pass 1? Karena waktu kita build GCC pertama kali (pass 1), kita cuma butuh compiler minimal untuk bisa ngejalanin langkah-langkah awal (terutama buat build Glibc). Kita skip Libstdc++ saat itu karena Libstdc++ butuh Glibc buat bisa dibangun dengan sempurna. Tapi waktu GCC Pass 1 dibangun, Glibc belum ada. Jadi, mustahil bangun Libstdc++ duluan. Karena dia nyangkut ke banyak fungsi dari Glibc, kita harus sabar sampe Glibc selesai dulu.
Untuk menginstall Libstdc++, silahkan pakai package <code>gcc-14.2.0.tar.xz</code>. Sisanya lakukan seperti build biasa
<syntaxhighlight lang=bash>
mkdir -v build
cd      build
../libstdc++-v3/configure          \
    --host=$LFS_TGT                \
    --build=$(../config.guess)      \
    --prefix=/usr                  \
    --disable-multilib              \
    --disable-nls                  \
    --disable-libstdcxx-pch        \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/14.2.0
make
make DESTDIR=$LFS install
rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 07:46, 16 April 2025

Sebelum mengcompile, pastikan:

  1. Sudah melakukan langkah-langkah sebelumnya
  2. Login sebagai user lfs
  3. Work directory di /mnt/lfs/sources/
  4. Ketika compile package:
    • Menggunakan tar untuk extract package
    • Pindah ke direktori hasil extract
    • Ikutin instruksi
    • Balik ke direktori source ketika compile sudah selesai
    • Delete hasil extract, kecuali kalo gak disuruh delete

Binutils-2.44

Binutils menyediakan linker dan assembler agar bisa digunakan oleh glibc dan gcc sebagai bagian inti dalam proses compile

mkdir -v build
cd       build

preprare

../configure --prefix=$LFS/tools \
             --with-sysroot=$LFS \
             --target=$LFS_TGT   \
             --disable-nls       \
             --enable-gprofng=no \
             --disable-werror    \
             --enable-new-dtags  \
             --enable-default-hash-style=gnu

compile

make
make install

GCC-14.2.0

GCC membutuhkan tiga pustaka penting sebagai dependensi utama, yaitu GMP, MPFR, dan MPC. Ketiga pustaka ini digunakan untuk mendukung perhitungan aritmatika presisi tinggi yang diperlukan dalam proses kompilasi. Karena tidak semua sistem host (distro Linux) secara default menyertakan versi yang kompatibel dari pustaka-pustaka ini, maka langkah aman dan direkomendasikan adalah membangunnya secara langsung bersamaan dengan GCC. Untuk itu, setiap arsip sumber dari GMP, MPFR, dan MPC perlu diekstrak ke dalam direktori sumber GCC, lalu direktori hasil ekstraksi tersebut di-rename sesuai yang dikenali oleh sistem build GCC. Dengan cara ini, sistem build GCC secara otomatis akan mendeteksi dan mengintegrasikan pustaka-pustaka tersebut ke dalam proses kompilasi, tanpa perlu konfigurasi tambahan. Langkah ini juga memastikan konsistensi versi dan kompatibilitas penuh antara GCC dan dependensinya selama pembangunan toolchain LFS.

tar -xf ../mpfr-4.2.1.tar.xz
mv -v mpfr-4.2.1 mpfr
tar -xf ../gmp-6.3.0.tar.xz
mv -v gmp-6.3.0 gmp
tar -xf ../mpc-1.3.1.tar.gz
mv -v mpc-1.3.1 mpc

Jika host pakai x86_64

case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
 ;;
esac

Sekarang untuk compile GCC

mkdir -v build
cd       build
../configure                  \
    --target=$LFS_TGT         \
    --prefix=$LFS/tools       \
    --with-glibc-version=2.41 \
    --with-sysroot=$LFS       \
    --with-newlib             \
    --without-headers         \
    --enable-default-pie      \
    --enable-default-ssp      \
    --disable-nls             \
    --disable-shared          \
    --disable-multilib        \
    --disable-threads         \
    --disable-libatomic       \
    --disable-libgomp         \
    --disable-libquadmath     \
    --disable-libssp          \
    --disable-libvtv          \
    --disable-libstdcxx       \
    --enable-languages=c,c++

compile

make
make install

Setelah selesai jalankan command

cd ../ 
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h

Command ini membuat file limits.h versi lengkap, lalu menaruhnya di direktori internal GCC, supaya GCC bisa mengenali batasan (limit) sistem secara utuh, walaupun sistem target-nya (LFS) belum punya Glibc lengkap. Hal ini dilakukan karena Saat ini, limits.h yang lengkap belum tersedia, karena glibc belum dibangun. GCC butuh header ini untuk meng-compile Glibc dan program lain nantinya. Kalau header ini tidak lengkap GCC bisa error atau compile-nya tidak optimal.

Linux-6.13.4 API Headers

Sebelum sistem bisa membangun pustaka C standar (Glibc), kernel Linux perlu menyediakan Application Programming Interface (API) berupa header file C yang bersih dan sesuai standar. Header-header ini digunakan Glibc agar dapat berkomunikasi dengan kernel, dan memastikan fungsi-fungsi dasar sistem seperti syscall bisa berjalan dengan benar. Header ini diambil dari source code kernel Linux, lalu disanitasi dan dipasang di direktori target agar Glibc bisa menggunakannya sebagai referensi saat dikompilasi.

make mrproper
make headers
find usr/include -type f ! -name '*.h' -delete
cp -rv usr/include $LFS/usr

Glibc-2.41

Glibc (GNU C Library) adalah library inti yang dipakai hampir semua program di Linux. Isinya fungsi-fungsi dasar seperti:

  • alokasi memori (malloc, free),
  • buka/tutup file,
  • operasi string (strlen, strcpy, dll),
  • input/output,
  • matematika dasar, dll.

Pertama-tama adalah membuat symbolic link untuk LSB (Linux Standard Base). Intinya, kita bikin symbolic link ke dynamic linker (ld-linux-x86-64.so.2) yang nanti Glibc bangun, supaya program-program bisa menemukan loader itu di tempat yang umum. Untuk arsitektur x86_64, symbolic link ke loader (ld-linux-x86-64.so.2) juga bikin sistem bisa jalanin program ELF 64-bit dengan benar. Ini bukan cuma soal kompatibilitas — ini syarat supaya semua binary nanti bisa jalan.

case $(uname -m) in
    i?86)   ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
    ;;
    x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
    ;;
esac

Glibc default-nya nyimpen data runtime di /var/db (yang non-standar). Padahal FHS nyaranin kita naruh data runtime di tempat seperti /var/cache dan /var/lib Makanya kita apply patch supaya Glibc gak nyimpang dari standar struktur direktori Linux.

patch -Np1 -i ../glibc-2.41-fhs-1.patch

Lalu selanjutnya

mkdir -v build
cd       build

# memastikan sln dan ldconfig terinstall di /usr/sbin 
echo "rootsbindir=/usr/sbin" > configparms

../configure                             \
      --prefix=/usr                      \
      --host=$LFS_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=5.4                \
      --with-headers=$LFS/usr/include    \
      --disable-nscd                     \
      libc_cv_slibdir=/usr/lib

make
make DESTDIR=$LFS install #DESTDIR=$LFS memastikan kalau package terisntall di $LFS, bukan di root (/)

sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd

Sebelum melangkah ke tahap selanjutnya, pastikan bahwa package yang kita install selama ini berfungsi dengan baik, caranya:

 
echo 'int main(){}' | $LFS_TGT-gcc -xc -
readelf -l a.out | grep ld-linux

kalau outputnya:

 
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

berati instalasi telah benar. Setelah itu bersihkan test file dengan menjalankan command rm -v a.out

Libstdc++ from GCC-14.2.0

Libstdc++ adalah library standar untuk bahasa C++ yang disediakan oleh GCC. Kenapa gak langsung dibuild di GCC Pass 1? Karena waktu kita build GCC pertama kali (pass 1), kita cuma butuh compiler minimal untuk bisa ngejalanin langkah-langkah awal (terutama buat build Glibc). Kita skip Libstdc++ saat itu karena Libstdc++ butuh Glibc buat bisa dibangun dengan sempurna. Tapi waktu GCC Pass 1 dibangun, Glibc belum ada. Jadi, mustahil bangun Libstdc++ duluan. Karena dia nyangkut ke banyak fungsi dari Glibc, kita harus sabar sampe Glibc selesai dulu.

Untuk menginstall Libstdc++, silahkan pakai package gcc-14.2.0.tar.xz. Sisanya lakukan seperti build biasa

mkdir -v build
cd       build
../libstdc++-v3/configure           \
    --host=$LFS_TGT                 \
    --build=$(../config.guess)      \
    --prefix=/usr                   \
    --disable-multilib              \
    --disable-nls                   \
    --disable-libstdcxx-pch         \
    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/14.2.0
make
make DESTDIR=$LFS install
rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la