2013-08-20 26 views
9

Bir kitaplığı bir bellek akışından yükleyebilir miyim? Örneğin kütüphanem bir dosya kodlu. Bazı koşulları kontrol edip dosyayı bir bellek akışına şifresini çözüyorum. Şimdi şifrelenmiş kütüphaneyi bu akıştan uygulamam içine yüklemem ve işlevlerini kullanmam gerekiyor.Bir kitaplığı bir bellek akışından yükleyebilir miyim?

+1

Bunu OSX için buldu: http://stackoverflow.com/questions/11821955/load-dynamic-library-from-memory ve bu pencereler için: http://stackoverflow.com/questions/638277/loading-dll- bellekten – koopajah

+0

Windows ve Linux için çözüme ihtiyacım var. –

cevap

4

Pencerelerde, bir DLL sadece bir dosyadan yüklenebilir - önerilen bağlantılar gibi, bir ramdisk oluşturabilir ve bunu yükleyebilirsiniz. bir sürücü olarak, ancak bir dosya sisteminde bulunan bir dosyadan yüklenmesi gereken DLL'nin hiçbir yolu yoktur. Bunun sebebi, DLL'nin "talep yüklenmiş" olmasıdır, yani sistem tüm dosyayı bir kerede belleğe yüklemez, aslında kullanılan parçaları yükler, 4KB (tipik olarak). Ayrıca takas alanına takas edilmez, sadece sistem hafızada çalışıyorsa, sadece atılır ve DLL'den yeniden yüklenir.

Linux çok benzer bir şekilde çalışıyor (varsayılan olarak aynı türden bir istek yüklemesini kullandığını biliyorum, ancak bir yol olup olmadığından emin değilim), bu yüzden başka bir yol olduğuna inanmıyorum ya da ben buna derinlemesine bakmadım.

Tabii ki, tek yapmanız gereken, uygulamanızda kullanabileceğiniz bir kod parçasıysa ve bunu, çok değerli dosyanızda şifrelenmiş/sıkıştırılmış olarak saklamak istiyorsanız, yapabileceğiniz şey bazı çalıştırılabilir bellek ayırmaktır. (Windows'da, çalıştırılabilir belleği ayırmak için VirtualAlloc'u kullanabilirsiniz). Ancak, bunu yaparsanız, kodunuzdaki mutlak bellek adreslerini yeniden konumlandırdığınızdan emin olmanız gerekir; bu nedenle, yer değiştirme bilgilerini yürütülebilir dosyanıza kaydetmeniz gerekir.

Açıkçası, kolay çözüm, içeriğinizi dosya sistemindeki bir dosyaya açmak ve oradan yüklemek.

+0

Ramdisk'ten daha iyi bir çözüm için https://github.com/fancycode/MemoryModule adresine bakın (eğer "iyi" veya "daha iyi" bir çözüm varsa), başlangıçtan denemenin iyi bir fikir olduğunu düşünmüyorum.). – Damon

+0

@Damon: Üçüncü paragrafta anlattığım şeyi, anlatabildiğim şeyden yapıyorum (kodun TÜMÜNÜ ayrıntılandırılmamıştı). –

+0

@MatsPeterson: Evet, tam olarak ne yaptığı. Bu çalışma bir uygulama (birkaç yıl önce denedim) ve OP'nin istediği için “ramdisk” yaklaşımından biraz daha iyi (zaten ramdisk'ten şifrelenmemiş dosyayı okuyabildiğin için). Tabii ki, yine de, VM yönetimine ciddi bir şekilde müdahale ettiğinden ve paylaşımlı bir kütüphane kavramına biraz ters düştüğü için, bu şeylerle başa çıkmak için iyi bir fikir olarak düşünmüyorum. DLL'lerin dosya tabanlı olması, aynı sayfaları birkaç işlemle eşleştirebilmeniz, bunları atabildiğiniz ve isteğe bağlı olarak yeniden yükleyebilmenizdir. – Damon

İlgili konular