El Capitan, kontrol et, DYLD_LIBRARY_PATH


9

Her zamanki Unix araç setini kullanarak uygulamalar geliştiriyorum: bir derleyici makeve paylaşılan kütüphaneler. Prosedür o zaman geleneksel olarak

  • ./configureçalıştığı makinenin özellikleri için kaynakları uyarlayan,
  • makeaslında paylaşılan kütüphaneleri, yürütülebilir dosyaları vb. derleyen,
  • make check, paketi yüklemeden önce testleri yürüten,
  • make install, paket düzgün davranıyorsa ve son olarak isteğe bağlı olarak,
  • make installcheck, kurulumun çalıştığından emin olmak için.

Sırasında make, paylaşılan kütüphaneler ve yürütülebilir dosyalar nihai formlarında derlenir: yürütülebilir dosyalar nihai hedeflerindeki paylaşılan kütüphanelere bağımlılık ile derlenirler (yani, /usr/local/libhenüz orada olmadıkları halde kütüphanelere bağımlıdırlar , hala inşa halindedirler. ağacı). Daha sonra make install, kabaca, sadece cpyapı ağacından son yere libs ve yürütülebilir dosyaları yüklemek için kullanılır .

make checkAşama sırasında, kaldırılan programı çalıştırıyoruz: paylaşılan kütüphaneler, yürütülebilir dosyalar ve yardımcı dosyalar hala yapı ağacında. Testleri çalıştırmak için birkaç özel ortam değişkeni (örneğin programınıza yardımcı veri dosyalarınızın içinde değil /usr/local/share, kaynak ağacında olduğunu söylemek için) ve bazı sistem ortamı değişkenlerini ve paylaşım lib yükleyicinize bakmasını söylemek için Paylaşılan kütüphaneler için. Geleneksel Unices üzerindeki ortam değişkenleri, LD_LIBRARY_PATHOS X'te öyle DYLD_LIBRARY_PATH. Bu, onlarca yıldır çalıştı.

Ama şimdi, El Capitan bunu kırdı.

$ (export FOO=foo; env) | grep foo
FOO=foo
$ (export DYLDFOO=foo; env) | grep foo
DYLDFOO=foo
$ (export DYLD_FOO=foo; env) | grep foo
$

şimdi, SIP etkinleştirildiğinde, hiçbir DYLD_*işlem bir işlemden alt öğelerine aktarılmaz.

Benim sorum şu: Yüklü olmayan programları nasıl çalıştırabiliriz? Geleneksel Unix dizisini çalıştırmak için izlenecek prosedür nedir ./configure && make && make check?

Lütfen , " make installönce koş" gibi bir cevap yok . Konu o değil. Ben bir geliştirici ve "yapmak kontrol" (ve daha genel olarak bir programın yüklü olmayan bir sürümünü çalışan) çalışan çok sık yaptığım bir şeydir. Sahte bir yere kurmak bile zaman alıcıdır. Etkili ve verimli bir şeye ihtiyacım var . SIP'yi devre dışı bırakmak, paketleri çalıştırmak isteyen kullanıcılar için sorunu çözmez make check.


DYLD_INSERT_LIBRARIES=$HOME/.bin/lib/Apple80211 /Applications/Utilities/AirPort\ Utility\ 5.6.app/Contents/MacOS/AirPort\ Utility\ 5.6(Değişken görünmese de env) 10.11 altında eski APU'yu (eski kütüphaneyle) çalıştırmak için hala kullanabilirim . Garip (ama işe yarıyor).
nohillside

Yanıtlar:


6

DYLD_ * sadece “korumalı” ikili dosyalar için sıyrılıyor gibi görünüyor (bunun tam olarak ne anlama geldiğinden emin değilim ama görünüşe göre / bin ve / usr / bin içindeki yeni başlayanlar için herhangi bir şey) Ancak, / usr / bin / env başka bir yere, DYLD_ * öğelerini saklar:

$ cp /usr/bin/env ~/Desktop; (DYLD_FOO=bar ~/Desktop/env)|grep DY
dyld: warning, unknown environment variable: DYLD_FOO
DYLD_FOO=bar

Bence make her zaman komutları / bin / sh ile çalıştırır, bu yüzden makefile içinde “tehlikeli” değişkenleri ayarlayamazsınız ve komutları etkilemesini sağlayabilirsiniz, ancak belki de testi bir kabuk betiğine taşıyabilir, ortam değişkenlerini komut dosyasını seçin ve ardından komut dosyasını make'den çağırın. Testler, sırayla, kabuk komut güvenmek durumunda rağmen belli ki, bu size yardımcı olmayacaktır (veya test şeyler eğer vardır kabuk komut!) O zaman / bin / sh çağırmak ve yeniden değişkenleri kaybedeceğiz çünkü .. .


Çok teşekkürler! Şimdi cp /bin/shgerçek kabuk yerine bu kabuğu kullanabilirim. Symlinks yapmaz ve zor bağlantılar "Operasyonlara izin verilmez", bu yüzden sanırım yaşamak zorundayım cp.
akim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.