Bu sayfada, Sandboxed API (SAPI) ile kendi korumalı C/C++ kitaplığınızı nasıl oluşturacağınız açıklanmaktadır. Üstbilgi dosyalarındaki örnekler ve kod dokümanlarıyla birlikte kılavuz olarak kullanın.
Derleme Bağımlılıkları
Sisteme aşağıdaki bağımlılıklar yüklenmelidir:
- UTS, IPC, kullanıcı, PID ve ağ ad alanlarını destekleyen Linux çekirdeği
- Linux kullanıcı alanı API başlıkları
- Kodunuzu derlemek için: GCC 6 (7 veya daha yeni bir sürüm tercih edilir) ya da Clang 7 (veya daha yeni bir sürüm)
- Başlık dosyalarını otomatik olarak oluşturmak için: Clang Python Bindings
- Python 3.5 veya sonraki sürümler
- Bazel 2.2.0 veya CMake 3.12 ya da sonraki bir sürüm.
Bazel'i kullanma
Bazel, önerilen derleme sistemidir ve entegrasyonu en kolay olanıdır.
Dokümanlarımızda Clang derleyicisi kullanılmaktadır. Belirli bir araç zincirine (ör. derleyici, bağlayıcı vb.) ihtiyacınız varsa varsayılan derleyici araç zincirini değiştirme hakkında bilgi edinmek 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 kaynaklı 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 projenizle ilgili iki öğe hazırlamanız gerekir:
- Korumalı alan kitaplığı
- Ana Makine Kodu, korumalı alan kitaplığınız tarafından kullanıma sunulan işlevsellikten yararlanır. SAPI, derleme işlemi sırasında SAPI nesnesini ve RPC saplamasını sizin için otomatik olarak oluşturur.
Sandbox2 örneklerinden zlib'i biliyor olabilirsiniz. Burada, zpipe.c adlı tam bir program korumalı alana alınmıştır. Aşağıdaki adımlarda, zlib kitaplığını korumalı alana almak ve Sandboxed Library'yi kullanmak için SAPI'yi nasıl kullanacağınızı öğreneceksiniz.
1. Hangi işlevlerin gerekli olduğuna karar verme
zlib ana makine koduna (main_zlib.cc) baktığınızda aracın işlevinin, stdin'den veri okumak ve EOF
işaretçisi okunana kadar verileri sıkıştırmak için zlib'in deflate()
işlevini kullanmak olduğunu görebilirsiniz.
Program, toplamda zlib'den üç işlev kullanır:
deflateInit_()
: Sıkıştırma için başlatmak üzeredeflate()
: Veri parçasında sıkıştırma işlemini gerçekleştirmek içindeflateEnd()
: Sıkıştırmayı sonlandırmak ve dinamik olarak ayrılan veri yapılarını serbest bırakmak için
Gerçek hayattaki bir örnekte C/C++ kitaplığını inceler ve hangi işlevlerin gerekli olduğuna karar verirsiniz. Olası bir strateji, ana makine koduyla başlayıp kitaplığı korumalı alan dışında kullanmaktır. Ardından, ikinci bir adımda, Sandboxed Library'yi oluşturabilir ve Host Code'u, korumalı alan işlevi çağrılarını kullanacak şekilde uyarlayabilirsiniz.
2. sapi_library Build Rule'u yazma
Koruma alanına alınmış zlib kitaplığından gereken üç zlib işlevini belirledikten sonra, BUILD dosyasında derleme kuralını tanımlayabilirsiniz. sapi_library
derleme kuralıyla ilgili dokümanları Derleme Kuralları sayfasında bulabilirsiniz.
Aşağıdaki kod snippet'inde, zlib SAPI örneği için sapi_library
tanımı gösterilmektedir. lib
özelliği kullanıldığında Bazel'e zlib kitaplığı için WORKSPACE dosyasını araması talimatı verilir.
sapi_library(
name = "zlib-sapi",
srcs = [],
hdrs = [],
functions = [
"deflateInit_",
"deflate",
"deflateEnd",
],
lib = "@net_zlib//:zlib",
lib_name = "Zlib",
namespace = "sapi::zlib",
)
Sonuç olarak, korumalı alan zlib kitaplığı oluşturulur. Çıkış, ana makine koduna dahil edilebilen ve RPC çağrıları aracılığıyla korumalı alan kitaplığıyla iletişim kurmak için kullanılabilen SAPI nesnesidir. Bu örnekte kullanılan Sandbox Politikası, varsayılan politikadır.
3. Toplantı kodunu yazma veya değiştirme
Artık oluşturulan SAPI kitaplığını ana makine koduna dahil etme zamanı.
Sandbox oluşturma
sapi::Sandbox sandbox(sapi::zlib::zlib_sapi_embed_create());
kullanarak bir
sandbox nesnesi oluşturun.
SAPI nesnesini oluşturmak ve böylece korumalı alan işlevlerini kullanıma sunmak için sapi::zlib::ZlibApi api(&sandbox);
öğesini kullanın.
SAPI Türlerini Kullanma
SAPI Türleri, bazen normal C türleri çalışmadığı için SAPI'nin sağladığı C++ sınıfları biçimindeki özel türlerdir.
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 kodun iyi bir örneğidir.
Daha fazla bilgi için Değişkenler sayfasına göz atın.
API çağrıları yapma
defalteInit_
, deflate
veya deflateEnd
numaralarını aramak için SAPI
Object'i kullanın. "Değiştirme" yaklaşımını kullanmaya karar verirseniz işlev parametrelerinin beklenen değerlerle eşleştiğinden emin olmanız gerekir.
zlib example içindeki her çağrıya ilişkin 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ı alan kitaplığından ayırır ve arayana sorunlu veri işleme isteklerini yeniden başlatma veya iptal etme olanağı tanır. SAPI İşlemi bir adım daha ileri giderek başarısız olan işlemleri otomatik olarak tekrar eder.
Daha fazla bilgi için SAPI İşlemleri Sayfası'na göz atın.
Örnekler
Örnekler bölümünde, SAPI ekibi tarafından hazırlanmış birkaç kitaplık bulabilirsiniz.