libhybris

Kötü komşu insanı mal sahibi yapar, kötü donanım üreticisi de insanı kütüphane sahibi yapar. Carsten Munk'un yazdığı libhybris'i anlatmanın en kısa yollarından biri bu sanırım. Uzun zamandır libhybris hakkında neredeyse hiç Türkçe içerik olmaması canımı sıkıyordu ama hiaaa libhybris ne kadar süper lan'dan hallice bir şeyler yazmak epey bir zaman gerektirdiğinden bunu gerçekleştiremiyordum. Atıfta bulunabileceğim Türkçe kaynaklar olmadığı için bağlantı verip geçemediğim birkaç konuyu da yazıya eklediğim için biraz uzayan yazıyı dört başlığa böldüm.


glibc

Linux çekirdeği bir GNU/Linux sisteminin özü olabilir ama ne kullanıcılar ne de uygulamalar doğrudan çekirdeği kullanır. Bunun yerine çekirdek ile hemen hemen bütün etkileşimler çekirdeğin fonksiyonları için standartlara uyumlu arayüz sağlayan bir C kütüphanesi ile yönetilir. Pek çok C kütüphane uyarlaması vardır ama gömülü cihazları hariç tutarsak çoğu GNU/Linux sisteminde GNU C kütüphanesi kullanılır.

Özgür bir yazılım olan ve LGPL altında dağıtılan GNU C Kütüphanesi veya daha yaygın olarak bilinen ismiyle glibc, GNU Projesinin C standart kütüphanesi uyarlamasıdır.

İlk olarak Özgür Yazılım Vakfı (FSF) tarafından GNU işletim sistemi için yazılmıştır. Kütüphanenin geliştirimi 2001 yılından sonra bir komite tarafından denetlenmekteydi ve Ulrich Drepper da kütüphanenin ana katkıcısı ve sürdürücüsüydü. Mart 2012'de komite kendisini topluluk odaklı gelişim sürecinin iyiliği için dağıtma kararı aldı ve Ryan Arnold, Maxim Kuvyrkov, Joseph Myers, Carlos O'Donell ve Alexandre Oliva karar alma yetkisi olmayan proje temsilcileri oldu.

glibc, ilk olarak 80'lerde Özgür Yazılım Vakfı için çalışan Roland McGrath tarafından yazılmıştır. 1988'de FSF, glibc'yi ANSI C'nin gerektirdiği işlevselliğin neredeyse tamamına sahip olarak tanımlamıştır. 1992 yılında glibc, ANSI C-1989 ve POSIX.1-1990 fonksiyonlarını içeriyordu ve POSIX.2 için çalışmalar devam ediyordu.

90'ların başında Linux çekirdek geliştiricileri glibc'yi, FSF'nin geliştirme hızının çok yavaş olduğunu ve ihtiyaçlarına cevap vermede yetersiz olduğunu düşündüklerinden çatalladı. Linux libc olarak isimlendirilen bu çatallanmış sürüm yıllarca ayrı olarak sürdürüldü.

FSF, Ocak 1997'de glibc 2.0'ı yayınladığında çok daha tam POSIX standart uyumluluğu, daha iyi uluslararasılaştırma ve çoklu dil işlevselliği, IPv6 desteği, 64 bit veri erişimi, çok iş parçacıklı uygulamalar için olanaklar, sonraki sürümlerle uyumluluk ve daha taşınabilir kodlar sunuyordu. Bu noktada, Linux çekirdek geliştiricileri kendi çatallarını sonlandırarak FSF'nin glibc kütüphanesini kullanmaya geri döndüler.

Linux libc'nin kullanılan son sürümü libc.so.5 dahili ismini kullanıyordu. Bundan sonra glibc 2.x Linux üzerinde libc.so.6 dahili ismini kullanmaya başladı.

Richard Stallman'a göre Linux libc'de yapılan değişiklikler, kodların yazarlarındaki belirsizliklerden ve GNU'nun telif hakkı ve yazar kayıtları hakkında epey katı olmasından dolayı glibc'ye geri aktarılamadı.

Günümüzde glibc, birçok farklı çekirdek ve donanım mimarisi üzerinde çalışıyor. En yaygın kullanımı x86 üzerindeki Linux çekirdekli sistemler olsa da, resmi olarak desteklen pek çok donanım var: x86, Motorola 680x0, DEC Alpha, PowerPC, ETRAX CRIS, s390, SPARC... Resmi olarak desteklenen çekirdeklerse Hurd ve Linux. Ayrıca yoğun olarak yamalanmış sürümleri FreeBSD, NetBSD ve OpenSolaris'te de kullanılıyor. Bunlara ek olarak libroot.so olarak isimlendirilen düzenlenmiş bir biçimi de BeOS ve Haiku'da kullanılıyor.

glibc, POSIX (1c, 1d ve 1j) ve Tek UNIX Belirtiminin gerektirdiği işlevleri, ISO C99, Berkeley Unix (BSD) arayüzleri, System V Arayüz Tanımlaması (SVID) ve X/Open Taşınabilirlik Rehberinin (XPG) gerektirdiği işlevlerin bazılarını sunar. Bunlara ek olarak glibc, GNU'nun geliştirilmesinde yararlı ve önemli olan eklentiler de sağlar.

glibc, geçmişte Linus Torvalds ve gömülü Linux geliştiricileri tarafından şişkin ve diğer kütüphanelerden daha yavaş olarak addedilmiş ve eleştirilmiştir. Bu nedenle daha küçük birkaç alternatif C kütüphanesi geliştirilmiştir. Bunlar arasında Bionic, dietlibc, uClibc, Newlib, Klibc, musl ve EGLIBC bulunmaktadır. Ancak birçok küçük cihaz projesi, uygulama desteği, standartlara uyumluluğu ve bütünlüğü dolayısıyla küçük alternatifleri yerine glibc'nin kendisini kullanmaktadır. Bunlara örnek olarak Openmoko ve iPaq el bilgisayarları için olan Familiar Linux gösterilebilir.


Bionic libc

Bionic libc, Google tarafından Android gömülü işletim sistemi için geliştirilen ve tasarımının arkasında işleri gerçekten basit tutma fikri olan bir standart C kütüphanesi türevidir.

Bionic isminin Türkçe'deki karşılığı tahmin edilebileceği gibi biyoniktir. Biyonik, teknik problemleri biyolojik işlevleri örnek alarak çözmeye çalışan uygulamalı bilim dalıdır. Doğada mevcut metod ve sistemleri inceleyip modern mühendislik sistemlerinde ve teknolojilerinde kullanmayı hedefler. Daha az bilimsel olarak ifade etmeye çalışırsak da biyonik, bünyelerinde elektronik ve mekanik parçalar bulunduran canlılara denir. Bionic de böyledir, bir parça BSD ve bir parça da Linux içerir. Bionic'in kaynak kodu BSD ile lisanslı C kütüphanesi parçaları ile iş parçacıkları, süreçler, sinyaller ve diğer birkaç şeyle daha ilgilenen Linux'a özgü parçaların bir karışımıdır.

Bionic, çekirdeğin temel özelliklerini hafif bir şekilde sarmalayacak bir yapı sunar ve uç durumlarla başa çıkmak için fazla kapsamlı olmaya çalışmaz. Bionic, GNU/Linux'a özgü birkaç büyük özelliğe sahiptir ve geliştirimi diğer kod tabanlarından bağımsız olarak devam etmektedir. Bionic'in açıkça belirlenmiş hedefleri aşağıdaki gibidir:
  • BSD lisanslı: Android, GNU Genel Kamu Lisansı ile lisanslanmış Linux çekirdeğini kullanmaktadır ama Google, Android uygulamalarını GPL'nin etkilerinden izole etmek için bu lisansı kullanmak istememektedir.
  • Küçük boyutlu: Bionic, GNU C Kütüphanesi'nden (glibc) çok daha küçük, uClibc'den de biraz daha küçüktür.
  • Hızlı: Bionic, nispeten düşük saat frekanslı işlemciler için tasarlanmıştır ve geniş karakter, C++ özel durum işleme desteği gibi tam libc uyarlamalarında yer alan birçok özelliğe sahip değildir. Ayrıca Bionic başlıklarında tanımlı çeşitli fonksiyonlar bazı durumlarda beklenmeyen davranışlar tetikleyebilecek şekilde hala gerçekleştirilmemiştir.
Bionic, ARM ve x86 komut setlerini desteklemektedir. Teorik olarak daha çoğu da küçük çalışmalarla desteklenebilir. Bionic'in GNU C Kütüphanesi, uClibc veya diğer bilinen Linux C kütüphaneleriyle çalıştırılabilir dosya uyumluluğu ise yoktur.

Android 4.2 ile birlikte Bionic Glibc'nin FORTIFY_SOURCE desteğine kavuşmuştur. FORTIFY_SOURCE, strcpy, strcat, memcpy gibi güvenli olmayan karakter dizisi ve bellek fonksiyonlarının, tampon bellek boyutunun derleme zamanında tespit edilebildiği durumlarda tampon taşmalarını kontrol etmesini sağlayan bir özelliktir. Bu özellik, gcc ile ARM işlemcilere göre derlenmiş uygulamalar için kullanılabilir.


Bionic ve glibc Arasındaki İlişki veya Bionic: Google'un Yolu

Burada bahsedemeyeceğim kadar detaylı ama belirtmeden de geçemeyeceğim kadar önemli bu konuyu Akın Ömeroğlu'nun GPL, Android ve “Bionic” sorunlar ve Edward J. Naughton'un The Bionic Library: Did Google Work around the GPL yazısından inceleyebilirsiniz.


libhybris

ARM üzerinde Linux'un en önemli sorunlarından biri platform için olan grafik sürücülerinin eksikliğidir. Bunun nedeni çoğu üreticinin yalnızca Bionic C kütüphanesi temelli Android'e yoğunlaşması ve glibc temelli Linux için aynı özeni göstermemesi. Bu durumu çözmek için temel olarak iki yol var:
  • Özgür grafik sürücüleri: Yapmanız gereken tek şey sürücüleri kendi platformunuz için derlemek olacağından ideal çözüm bu olurdu.
  • Bionic'ten glibc'ye dönüştürücü kütüphane: Bu kütüphane libdl gibi davranır ve Bionic kütüphanesini yükleyerek buradaki sembolleri glibc temellilerle değiştirir. Bu tam da libhybris'in yaptığı şeydir.
C ile yazılan libhybris, Apache 2.0 lisansıyla dağıtılmaktadır ve kodlar GitHub üzerinde yayınlanmaktadır. libhybris, GNU uyumlu Linux dağıtımlarında özellikle Android kütüphane ve aygıt sürücüleri olmak üzere Bionic temelli Linux sistemleri için yazılmış yazılımları çalıştırmak için bir uyumluluk katmanıdır.

libhybris, ilk olarak daha sonra Jolla tarafından baş araştırma mühendisi olarak istihdam edilmeye başlanan Mer geliştiricisi Carsten Munk tarafından yazılmış ve 5 Ağustos 2012'de GitHub üzerinden yayınlanmıştır.

libhybris ayrıca WebOS Ports için Open webOS topluluğu ve Ubuntu Touch için Canonical tarafından da kullanılmaya başlandı.

Nisan 2013'te Munk, libhybris'in Wayland kompozitörlerinin Android için yazılmış grafik aygıt sürücülerini kullanmasını sağlayacak şekilde genişletildiğini duyurdu. Weston'a libhybris desteği ise 11 Ekim 2013'te yayınlanan 1.3 sürümüyle birlikte geldi.

libhybris'in ana özelliği öncelikli Bionic çağrılarını glibc çağrılarına çevirmektir. Android grafik sürücülerinin Wayland tabanlı sistemlerde çalışabilmesi için libhybris ayrıca Android'in EGL çağrılarını Wayland EGL çağrılarına çevirmektedir. Bu özellik ilk olarak Collabora'dan Pekka Paalanen tarafından Android üzerinde Wayland çalıştırmak için geliştirilmiştir.

libhybris her ne kadar özgür donanım sürücüleri kadar ideal bir çözüm olmasa da şu an elimizdeki en pratik çözüm.

Kaynaklar
Wikipedia - GNU C Library
glibc wiki
A turning point for GNU libc
History of glibc and Linux libc

Wikipedia - Bionic (software)
The Six Million Dollar LibC
Bionic C Library Overview
Bionic kaynak deposu
Bionic kaynak depo yansısı
Vikipedi - Biyonik

Wikipedia - Hybris (software)
Ekşi Sözlük - libhybris
Mer Proje Günlüğü
Libhybris Let You Use Android Drivers & HW Libraries in Linux
Sailfish OS running on a Sony Xperia Device + libhybris enabled ARM cubieboard2