LFS: Compile Cross-toolchain: Difference between revisions
No edit summary |
|||
| Line 157: | Line 157: | ||
= Libstdc++ from GCC-14.2.0 = | = 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> | |||
Latest revision as of 07:46, 16 April 2025
Sebelum mengcompile, pastikan:
- Sudah melakukan langkah-langkah sebelumnya
- Login sebagai user lfs
- Work directory di
/mnt/lfs/sources/ - Ketika compile package:
- Menggunakan
taruntuk extract package - Pindah ke direktori hasil extract
- Ikutin instruksi
- Balik ke direktori
sourceketika compile sudah selesai - Delete hasil extract, kecuali kalo gak disuruh delete
- Menggunakan
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