Xaç tərtib edən Rust və necə kiçik binarları əldə etmək olar

Bunu oxuyursanız, çox güman ki, Rustə olan sevginizi bir müddət əvvəl kəşf etmisiniz və bu ecazkar dildən istifadə etməkdə bir qədər təcrübəlisınız.

Düşük olmayan bacarıqlarımla öyünməyəcəyəm və ya dilin bu ecazkar heyvanına girmək üçün başqa bir dərs verməyə çalışacağam. İstədiyiniz kimi Rusti öyrənmək üçün başqa böyük resessiyaların tonu var. Rustlings və ya pas kitabı.

Sizə göstərmək istədiyim, həyatı bu qədər asanlaşdıran Rust ekosisteminin başqa bir tərəfidir.

Xaç tərtibatı

Başlıqdan bildiyiniz kimi, Rost kodunu tərtib etdiyiniz sistemdən fərqli olaraq əməliyyat sistemlərini və / və ya CPU arxitekturalarını işləyə bilən ikili sənədlərə yönəldəcəyəm.

Mənim vəziyyətimdə ARM v7-də Linux üçün bəzi tətbiqlər tərtib etmək üçün Mac OS X istifadə etməliyəm.

Xaç tərtibinə nifrət edirəm

Çalışdığınız əməliyyat sistemini məhv etməyin milyonlarla yolu var və çarpaz tərtib etmək onlardan biridir. Adətən bir Linksys WRT 1900 ACS (OpenWRT və ARMv7) üzərində çalışmaq üçün kiçik bir proqram üçün ehtiyac duyduğunuz bir qurmaq zəncirinin alınması günahsız fikri ilə başlayır.

Ətrafınızda qazma işində Reddit-də bir neçə müxtəlif parçanı və ya GitHub layihəsində təsadüfi bir insanın sizə lazım olan məlumatların azlığına bənzər bir neçə sətir yerləşdirdiyi yerlərdə tapın.

Başını işlətmək sonra aşağıdakılardan birini yarada bilər:

  • İşləmə qurma zənciri yaradın (çox çətin)
  • Quraşdırmanın 80% -dən sonra uğursuz bir zəncir yaradın
  • Əslində işləyən bir qurma zənciri yaratmağı iddia edərkən yerli bitcoin madenceri əlavə edin

Bir az daha bilikli olmaq (aka qoca olmaq) Mən bu işlərdə bir az ehtiyatlıyam. Buna görə normal olaraq bütün təcrübələrim üçün Uca Hashicorp tərəfindən Vagrant istifadə edirəm.

Lazım olan qurma zəncirlərini yaratmaq prosesində ton tonqal qutuları sındırdım (ruhları dincəlsin).

90-cı illərdə C-kodlayıcı kimi başladığım yerdən o qədər pis xatirələr gətirdim ki, bu, demək olar ki, JVM (Graal doğma şəklini istifadə edərək) ya da kompozisiya tərtibindən istifadə edərək geri dönməyə məcbur etdi.

Sınaq və səhv rejiminə keçməzdən əvvəl belə bir az uzun müddət axtarsam, özümü o qədər məyusluqdan xilas edə bilərdim.

Mən Xaç Kompilyasiyasını (və Docker) sevirəm

Bir neçə dəfə ağır uğursuzluqdan sonra nəhayət oturdum və Rust cəmiyyətinin təklif etməsi ilə bağlı bir az araşdırma apardım (bu daha çox axtarış apardım ...).

Və Docker-a əsaslanan tərtib zəncir idarəetmə vasitəsi olan xaç tapdım. Düzünü deyim: Çarpaz tərtib olunmağa gəldikdə arzuladığım hər şey budur.

Çapraz əmrini almaq üçün aşağıdakı əmri işə salın:

yük quraşdırma xaç

Bu andan etibarən başqa bir memarlıq üçün tikinti aşağıdakı əmrlə yazmaq qədər asandır:

çarpaz qurmaq --target = armv7-naməlum-linux-musleabihf

Bu, OpenWRT Arm v7 hədəf platformasında işləyə biləcək bir ikili istehsal edəcəkdir.

Uğur!

Arxa planda baş verənlər hədəf olaraq göstərilən fərdi qurma zəncirini ehtiva edən Docker konteynerləri çəkilir. Kodunuz ikili istehsal edərək həqiqi kompilyasiyanın baş verdiyi konteynerə quraşdırılacaqdır.

Bu yanaşmanın bir sıra üstünlükləri var:

  • Sisteminizi məhv etmək üçün heç bir təhlükə yoxdur.
  • Docker işləyən bütün əməliyyat sistemləri arasında çoxalır
  • Qurğuları bir CI boru kəmərinə yerləşdirmək asandır

Birdən pis C-xatirələrim bitdi və ətrafımda yatdığım müxtəlif ARM-SoC-lər üçün boru kəmərləri çəkərək ətrafında oynamağa başladım. Döyüş saatları bitdi, mövcud zəncirlər siyahısına dəyişdirildi və tez bir zamanda oynadı.

Nəticələr və bəzi ölçü inkişafları

Çarpaz tərtibçinin istehsal etdiyi nəticələrə nəzər salaq.

Bir az təcrübə etdim, qonaq hesabları üçün QR-kodları evimdəki WiFi-yə (yuxarıda göstərilən Linksys OpenWRT-yə) təqdim edəcək bir Rust proqramı hazırladım.

Aşağıdakı sətirdən istifadə edərək ikili yarada bildim:

çarpaz qurmaq --target = armv7-naməlum-linux-musleabihf

Yaranan binarın ölçüsü bir çox 5.7 MB idi. Disk sahəsi tam bollu olmayan bir SoC-yə yerləşdirmək üçün olduqca yaxşı bir paketdir.

Kompilyator seçimlərinə bir az qazmaq vaxtı.

Sərbəst buraxma seçimindən istifadə edərək debug simvollarını ikitərəfli silmək mümkündür:

cross build --release --target = armv7-naməlum-linux-musleabihf

Bu, ölçüsü 3.0 MB-a, almosun 50% azalmasına gətirib çıxarır. Bu qədər kiçik bir işləmə üçün təsir edici, lakin hələ də böyük bir ikili.

Ancaq tərtib etmə halları var, buna görə başqa bir yerə baxmaq məcburiyyətindəyik.

Bu yaxınlarda, İnstanda hazırkı layihəm üçün bəzi Go-kod üzərində işləyərkən, upx kəşf etdim. UPX, ölçülü Go-ikili faylları azaltmaq üçün əla bir iş görən icraedicilər üçün bir qablaşdırmadır. Mən yeni xaç tərtib edilmiş ikili ilə cəhd etməyə dəyər ola biləcəyini düşündüm:

upx - çirkin 

Nəticələr: ikili 700 KB-a qədərdir.

Bu, gözlədiyim hər şeydən daha yaxşıdır. Bir başlanğıc ölçüsündən 88% aşağı, bir meqabaytın altındayıq.

Xülasə

Rust yalnız heyrətamiz bir dildir, onun bütün ekosistemi heyrətamizdir və həqiqətən ağrılı şeyləri həll edir. Qurma zəncirlərini idarə etmək üçün Docker əsaslı bir həll istifadə, bir ton ağrını çarpaz kompilyasiyadan uzaqlaşdırır.

Ancaq ən çox bəyəndiyim nəticə UPX tərəfindən əldə edilən ölçü azalmasıdır.