Bu sayfada Korumalı Alana Sahip API (SAPI) ile kendi korumalı alanlı C/C++ kitaplığınızı nasıl oluşturacağınızı öğreneceksiniz. Bunu, başlık dosyalarındaki örnekler ve kod dokümanlarıyla birlikte bir kılavuz olarak kullanın.
Bağımlılıklar Derleme
Aşağıdaki bağımlılıklar sisteme yüklenmelidir:
- UTS, IPC, kullanıcı, PID ve ağ ad alanlarını destekleyen Linux çekirdeği
- Linux kullanıcı alanı API üstbilgileri
- Kodunuzu derlemek için: GCC 6 (sürüm 7 veya üstü tercih edilir) ya da Clang 7 (veya üstü)
- Başlık dosyalarının otomatik olarak oluşturulması için: Clang Python Bağlamaları
- Python 3.5 veya sonraki sürümler
- Bazel 2.2.0 sürümü veya CMake 3.12 ya da sonraki bir sürüm.
Bazel kullanma
Bazel önerilen derleme sistemidir ve entegre edilmesi en kolay olan sistemdir.
Dokümanlarımız Clang derleyicisini kullanmaktadır. Belirli bir araç zincirine (ör. derleyici, bağlayıcı vb.) ihtiyacınız varsa varsayılan derleyici araç zincirinin nasıl değiştirileceğiyle ilgili bilgi için Bazel dokümanlarına bakın.
Debian 10 (Buster)
Derleme bağımlılıklarını yüklemek için:
echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | \ sudo tee /etc/apt/sources.list.d/bazel.list
wget -qO - https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -qy build-essential linux-libc-dev bazel python3 \ python3-pip libclang-dev
pip3 install clang
Gentoo
Gerekli çekirdek seçenekleri:
General setup --->
-*- Namespaces support
[*] UTS namespace
[*] IPC namespace
[*] User namespace (EXPERIMENTAL)
[*] PID Namespaces
[*] Network namespace
Derleme bağımlılıklarını yüklemek için:
emerge dev-util/bazel dev-python/typing dev-python/clang-python
CMake'ı Kullanma
CMake, Ninja veya Make gibi derleme araçları için proje dosyaları oluşturan popüler bir açık kaynak meta derleme sistemidir.
Debian 10 (Buster)
Derleme bağımlılıklarını yüklemek için:
sudo apt-get install -qy build-essential linux-libc-dev cmake ninja-build \ python3 python3-pip libclang-dev libcap-dev
pip3 install absl-py clang
Gentoo
Gerekli çekirdek seçenekleri:
General setup --->
-*- Namespaces support
[*] UTS namespace
[*] IPC namespace
[*] User namespace (EXPERIMENTAL)
[*] PID Namespaces
[*] Network namespace
Derleme bağımlılıklarını yüklemek için:
emerge sys-kernel/linux-headers dev-util/cmake dev-util/ninja \
dev-python/clang-python
Geliştirme Süreci
Bir C/C++ kitaplığını korumalı alana almak için projeniz için iki öğe hazırlamanız gerekir:
- Korumalı Alana Sahip Kitaplık
- Korumalı Alana Sahip Kitaplığınızda sunulan işlevleri kullanacak Ana Makine Kodu. SAPI, derleme işlemi sırasında SAPI Nesnesini ve RPC Stub'unu sizin için otomatik olarak oluşturur.
Sandbox2 örneklerinden zlib'e aşina olabilirsiniz. Buradaki tüm program (zpipe.c) korumalı alana alınmıştır. Aşağıdaki adımlarda zlib kitaplığını korumalı alana almak için SAPI'yi ve Korumalı Alana Sahip Kitaplık'tan nasıl yararlanacağınızı öğreneceksiniz.
1. Hangi işlevlerin gerektiğine karar verme
zlib ana makine koduna (main_zlib.cc) bakarsanız aracın işlevlerinin, verileri stdin'den okumak ve zlib deflate()
işlevini kullanarak verileri bir EOF
işaretçisi okununcaya kadar sıkıştırmak olduğunu görebilirsiniz. Program, toplamda zlib'den üç işlev kullanır:
deflateInit_()
: Sıkıştırma işlemini başlatmak içindeflate()
: Veri parçası üzerinde sıkıştırma işlemini gerçekleştirmek içindeflateEnd()
: Sıkıştırmayı ve dinamik olarak ayrılmış ücretsiz veri yapılarını sonlandırmak için
Gerçek hayattan bir örnekte, C/C++ kitaplığını inceler ve hangi işlevlerin gerekli olduğuna karar verirsiniz. Olası bir strateji, Ana Makine Kodu ile başlamak ve kitaplığı korumalı alana alınmadan kullanmaktır. Ardından, ikinci bir adımda, Korumalı Alana Sahip Kitaplık oluşturabilir ve Ana Makine Kodunu korumalı alana alınmış işlev çağrılarını kullanacak şekilde uyarlayabilirsiniz.
2. sapi_library Derleme Kuralını yazma
Korumalı alana alınmış zlib kitaplığından gereken üç zlib işlevini tanımladıktan sonra, derleme kuralını BUILD dosyasında tanımlayabilirsiniz. sapi_library
derleme kuralıyla ilgili dokümanlar, Derleme Kuralları sayfasında bulunabilir.
Aşağıdaki kod snippet'i, zlib SAPI örneğinin sapi_library
tanımını göstermektedir. Bazel'a lib
özelliği kullanılarak zlib kitaplığı için WORKSPACE dosyasına bakması istenir.
sapi_library(
name = "zlib-sapi",
srcs = [],
hdrs = [],
functions = [
"deflateInit_",
"deflate",
"deflateEnd",
],
lib = "@net_zlib//:zlib",
lib_name = "Zlib",
namespace = "sapi::zlib",
)
Bunun sonucunda, korumalı alana alınmış zlib kitaplığı oluşturulur. Çıkış, Ana Makine Koduna eklenebilen ve korumalı alana alınan kitaplıkla RPC çağrıları aracılığıyla iletişim kurmak için kullanılabilen SAPI Nesnesidir. Bu örnekte kullanılan Korumalı Alan Politikası varsayılan politikadır.
3. Ana Makine Kodunu Yazma veya Değiştirme
Şimdi, oluşturulan SAPI Kitaplığı'nı Ana Makine Koduna ekleme zamanı geldi.
Korumalı Alan Oluşturma
Korumalı alan nesnesi oluşturmak için sapi::Sandbox sandbox(sapi::zlib::zlib_sapi_embed_create());
öğesini kullanın.
SAPI Nesnesini örneklendirmek ve böylece korumalı alana alınan işlevleri kullanılabilir hale getirmek için sapi::zlib::ZlibApi api(&sandbox);
kullanın.
SAPI Türlerini Kullanın
SAPI Türleri, SAPI'nin sağladığı C++ sınıfları biçimindeki özel türlerdir. Bunun nedeni, bazen normal C türlerinin çalışmamasıdır.
Bir SAPI türünün ilk kullanımı, strm
bildiriminde görülebilir. Burada bir SAPI Yapısı kullanılır: sapi::v::Struct<sapi::zlib::z_stream> strm;
Şablon türü (sapi::zlib::z_stream
), derleme kuralı tarafından otomatik olarak oluşturulan koda iyi bir örnektir.
Daha ayrıntılı bilgi için Değişkenler sayfasına göz atın.
API Çağrıları Yapın
defalteInit_
, deflate
veya deflateEnd
'ye çağrı yapmak için SAPI Nesnesi'ni kullanın. "Değiştir" yaklaşımını kullanmaya karar verirseniz, işlev parametrelerinin beklenen değerlerle eşleştiğinden emin olmanız gerekir.
zlib örneğindeki çağrıların her birine bir örnek:
api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION, version.PtrBefore(), sizeof(sapi::zlib::z_stream));
api.deflate(strm.PtrBoth(), flush);
api.deflateEnd(strm.PtrBoth()).IgnoreError();
SAPI İşlemlerini Kullanma
SAPI, Ana Makine Kodunu Korumalı Alana Sahip Kitaplık'tan izole eder ve çağrı yapana, sorunlu veri işleme isteklerini yeniden başlatma veya iptal etme olanağı verir. SAPI İşlemi bir adım daha ileri gidip başarısız işlemleri otomatik olarak tekrarlar.
Daha fazla ayrıntı için SAPI İşlemleri sayfasına göz atın.
Örnekler
Örnekler altında, SAPI ekibi tarafından önceden hazırlanmış birkaç kitaplığı bulabilirsiniz.