GNU/Linux >> Belajar Linux >  >> Linux

Dukungan hidup 32-bit:Kompilasi silang dengan GCC

Jika Anda seorang pengembang yang membuat paket biner, seperti RPM, DEB, Flatpak, atau Snap, Anda harus mengkompilasi kode untuk berbagai platform target yang berbeda. Target umum termasuk 32-bit dan 64-bit x86 dan ARM. Anda dapat melakukan pembangunan pada mesin fisik atau virtual yang berbeda, tetapi itu berarti memelihara beberapa sistem. Sebagai gantinya, Anda dapat menggunakan GNU Compiler Collection (GCC) untuk mengkompilasi silang, menghasilkan binari untuk beberapa arsitektur berbeda dari satu mesin build.

Asumsikan Anda memiliki permainan dadu sederhana yang ingin Anda kompilasi silang. Sesuatu yang ditulis dalam C relatif mudah pada kebanyakan sistem, jadi untuk menambah kerumitan demi realisme, saya menulis contoh ini dalam C++, jadi programnya bergantung pada sesuatu yang tidak ada di C (iostream , khususnya).

#include <iostream>
#include <cstdlib>

using namespace std;

void lose (int c);
void win (int c);
void draw ();

int main() {
  int i;
    do {
      cout << "Pick a number between 1 and 20: \n";
      cin >> i;
      int c = rand ( ) % 21;
      if (i > 20) lose (c);
      else if (i < c ) lose (c);
      else if (i > c ) win (c);
      else draw ();
      }
      while (1==1);
      }

void lose (int c )
  {
    cout << "You lose! Computer rolled " << c << "\n";
  }

void win (int c )
  {
    cout << "You win!! Computer rolled " << c << "\n";
   }

void draw ( )
   {
     cout << "What are the chances. You tied. Try again, I dare you! \n";
   }

Kompilasi di sistem Anda menggunakan g++ perintah:

$ g++ dice.cpp -o dice

Kemudian jalankan untuk mengonfirmasi bahwa itu berfungsi:

$ ./dice
Pick a number between 1 and 20:
[...]

Anda dapat melihat jenis biner yang baru saja Anda buat dengan file perintah:

$ file ./dice
dice: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 5.1.15, not stripped

Dan yang tak kalah pentingnya, perpustakaan apa yang ditautkannya dengan ldd :

$ ldd dice
linux-vdso.so.1 => (0x00007ffe0d1dc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6
(0x00007fce8410e000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
(0x00007fce83d4f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
(0x00007fce83a52000)
/lib64/ld-linux-x86-64.so.2 (0x00007fce84449000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
(0x00007fce8383c000)

Anda telah mengkonfirmasi dua hal dari pengujian ini:Biner yang baru saja Anda jalankan adalah 64-bit, dan ditautkan ke perpustakaan 64-bit.

Artinya, untuk melakukan kompilasi silang untuk 32-bit, Anda harus memberi tahu g++ ke:

  1. Menghasilkan biner 32-bit
  2. Tautkan ke pustaka 32-bit alih-alih pustaka 64-bit default

Menyiapkan lingkungan dev Anda

Untuk mengompilasi ke 32-bit, Anda memerlukan pustaka dan header 32-bit yang diinstal pada sistem Anda. Jika Anda menjalankan sistem 64-bit murni, maka Anda tidak memiliki pustaka atau header 32-bit dan perlu menginstal set dasar. Paling tidak, Anda memerlukan pustaka C dan C++ (glibc dan libstdc++ ) bersama dengan pustaka GCC versi 32-bit (libgcc ). Nama-nama paket ini dapat bervariasi dari distribusi ke distribusi. Di Slackware, distribusi 64-bit murni dengan kompatibilitas 32-bit tersedia dari multilib paket yang disediakan oleh Alien BOB. Di Fedora, CentOS, dan RHEL:

$ yum install libstdc++-*.i686
$ yum install glibc-*.i686
$ yum install libgcc.i686

Terlepas dari sistem yang Anda gunakan, Anda juga harus menginstal pustaka 32-bit yang digunakan proyek Anda. Misalnya, jika Anda menyertakan yaml-cpp dalam proyek Anda, maka Anda harus menginstal versi 32-bit yaml-cpp atau, pada banyak sistem, paket pengembangan untuk yaml-cpp (misalnya, yaml-cpp-devel di Fedora) sebelum mengompilasinya.

Setelah selesai, kompilasinya cukup sederhana:

$ g++ -m32 dice.cpp -o dice32 -L /usr/lib -march=i686

-m32 flag memberitahu GCC untuk mengkompilasi dalam mode 32-bit. -march=i686 lebih lanjut menentukan jenis pengoptimalan yang akan digunakan (lihat info gcc untuk daftar opsi). -L flag menyetel jalur ke pustaka yang Anda inginkan untuk ditautkan ke GCC. Ini biasanya /usr/lib untuk 32-bit, meskipun, tergantung pada bagaimana sistem Anda diatur, itu bisa menjadi /usr/lib32 atau bahkan /opt/usr/lib atau di mana pun Anda tahu Anda menyimpan perpustakaan 32-bit.

Setelah kode dikompilasi, lihat bukti build Anda:

$ file ./dice32
dice: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs) [...]

Dan, tentu saja, ldd ./dice32 menunjuk ke perpustakaan 32-bit Anda.

Arsitektur yang berbeda

Terminal Linux

  • 7 emulator terminal teratas untuk Linux
  • 10 alat baris perintah untuk analisis data di Linux
  • Unduh Sekarang:lembar contekan SSH
  • Lembar contekan perintah Linux tingkat lanjut
  • Tutorial baris perintah Linux

Kompilasi 32-bit pada 64-bit untuk keluarga prosesor yang sama memungkinkan GCC membuat banyak asumsi tentang cara mengompilasi kode. Jika perlu mengompilasi untuk prosesor yang sama sekali berbeda, Anda harus menginstal utilitas GCC lintas build yang sesuai. Utilitas mana yang Anda instal tergantung pada apa yang Anda kompilasi. Proses ini sedikit lebih rumit daripada kompilasi untuk keluarga CPU yang sama.

Saat Anda melakukan kompilasi silang untuk keluarga yang sama, Anda dapat mengharapkan untuk menemukan kumpulan pustaka 32-bit yang sama dengan pustaka 64-bit, karena distribusi Linux Anda memelihara keduanya. Saat mengkompilasi untuk arsitektur yang sama sekali berbeda, Anda mungkin harus mencari pustaka yang diperlukan oleh kode Anda. Versi yang Anda perlukan mungkin tidak ada dalam repositori distribusi Anda karena distribusi Anda mungkin tidak menyediakan paket untuk sistem target Anda, atau mungkin tidak mencerminkan semua paket di lokasi yang nyaman. Jika kode yang Anda kompilasi adalah milik Anda, maka Anda mungkin memiliki gagasan yang bagus tentang ketergantungannya dan mungkin di mana menemukannya. Jika kodenya adalah sesuatu yang telah Anda unduh dan perlu dikompilasi, maka Anda mungkin tidak begitu akrab dengan persyaratannya. Dalam hal ini, selidiki apa yang diperlukan kode untuk membangun dengan benar (biasanya tercantum dalam file README atau INSTALL, dan tentu saja dalam kode sumber itu sendiri), lalu kumpulkan komponennya.

Misalnya, jika Anda perlu mengkompilasi kode C untuk ARM, Anda harus terlebih dahulu menginstal gcc-arm-linux-gnu (32-bit) atau gcc-aarch64-linux-gnu (64-bit) di Fedora atau RHEL, atau arm-linux-gnueabi-gcc dan binutils-arm-linux-gnueabi di Ubuntu. Ini menyediakan perintah dan perpustakaan yang Anda butuhkan untuk membangun (setidaknya) program C sederhana. Selain itu, Anda memerlukan pustaka apa pun yang digunakan kode Anda. Anda dapat menempatkan file header di lokasi biasa (/usr/include pada sebagian besar sistem), atau Anda dapat menempatkannya di direktori pilihan Anda dan mengarahkan GCC ke sana dengan -I pilihan.

Saat mengkompilasi, jangan gunakan gcc standar atau g++ memerintah. Sebagai gantinya, gunakan utilitas GCC yang Anda instal. Misalnya:

$ arm-linux-gnu-g++ dice.cpp \
  -I/home/seth/src/crossbuild/arm/cpp \
  -o armdice.bin

Verifikasi apa yang telah Anda buat:

$ file armdice.bin
armdice.bin: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV) [...]

Perpustakaan dan kiriman

Ini adalah contoh sederhana tentang bagaimana menggunakan kompilasi silang. Dalam kehidupan nyata, kode sumber Anda dapat menghasilkan lebih dari sekadar biner tunggal. Meskipun Anda dapat mengelola ini secara manual, mungkin tidak ada alasan yang baik untuk melakukannya. Dalam artikel saya berikutnya, saya akan mendemonstrasikan GNU Autotools, yang melakukan sebagian besar pekerjaan yang diperlukan untuk membuat kode Anda portabel.


Linux
  1. BleachBit 4.1.1 Dirilis dengan Dukungan Cleaning Slack

  2. Mozilla Firefox 84.0 Dirilis dengan Dukungan Asli Apple Silicon

  3. Mencari Editor File Gui Alternatif Dengan Dukungan File Besar?

  1. Kali Linux 1.0.8 Rilis dengan Dukungan Boot EFI

  2. Cara mengkompilasi biner 32-bit pada mesin linux 64-bit dengan gcc/cmake

  3. Kompiler lateks dengan dukungan paralel

  1. Plesk Onyx Akhir Kehidupan

  2. KeePassXC 2.6.4 Dirilis dengan Dukungan Apple Silicon M1

  3. Driver Printer HP HPLIP 3.21.4 Dirilis dengan Dukungan HP Envy 6400