Yolunu kullanarak bir dylib sürümünü bulmanın bir yolu var mı? Ben dlopen ile aynı argümanları kabul eden bir şey arıyorum. NSVersionOfRunTimeLibrary'a baktım, ancak belgelerin okunmasından, yolunda belirtilen değil, mevcut dylib dosyasının sürümünü aldığını görüyorum. dlopen kullanarak dylib sürümünü bulma
size Üzerindecevap
Çalıştır otool -L
ederiz ve onun aslında versiyonunu gösterecektir. Ben 10.4 ve 10.5 SDK'larından farklı sürüme sahip olarak libSystem.B seç:
$ otool -L /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libSystem.B.dylib
/Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libSystem.B.dylib:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 88.3.11)
/usr/lib/system/libmathCommon.A.dylib (compatibility version 1.0.0, current version 220.0.0)
$ otool -L /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.B.dylib
/Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.B.dylib:
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.1.4)
/usr/lib/system/libmathCommon.A.dylib (compatibility version 1.0.0, current version 292.4.0)
(ilki 88.3.11 sürümüne sahip nasıl ikinci 111.1.4 sahipken, bakınız). İşte
$ ll /Developer/SDKs/MacOSX10.*.sdk/usr/lib/libSystem.B.dylib
-rwxr-xr-x 1 root wheel 749K May 15 2009 /Developer/SDKs/MacOSX10.4u.sdk/usr/lib/libSystem.B.dylib
-rwxr-xr-x 1 root wheel 670K May 15 2009 /Developer/SDKs/MacOSX10.5.sdk/usr/lib/libSystem.B.dylib
-rwxr-xr-x 1 root wheel 901K Sep 25 00:21 /Developer/SDKs/MacOSX10.6.sdk/usr/lib/libSystem.B.dylib
, dosyalar kendi adlarına sürüm numarası yok: Bu örnek değil bütün kütüphaneler içlerindeki sürüm numarasına sahip dosyalara sembolik bağlantılar olduğunu göstermektedir.
DÜZENLEME: ikinci bir çözüm, kontrol etmek istediğiniz kitaplığı yüklemeye zorladığınız bir sınama programında NSVersionOfRunTimeLibrary
kullanmaktır. Aşağıdaki C kaynağından bir program libversion
oluşturun:
#include <stdio.h>
#include <mach-o/dyld.h>
int main (int argc, char **argv)
{
printf ("%x\n", NSVersionOfRunTimeLibrary (argv[1]));
return 0;
}
Sonra böyle diyoruz:
$ DYLD_INSERT_LIBRARIES=/usr/lib/libpam.2.dylib ./a.out libpam.2.dylib
30000
(burada, sürüm numarası onaltılık olarak yazdırılır, ancak ihtiyaçlarına uyum sağlayabilen .)
burada NSVersionOfRunTimeLibrary kaynak kodunu kontrol edebilirsiniz: http://www.opensource.apple.com/source/dyld/dyld-132.13/src/dyldAPIsInLibSystem.cpp
tha dayanarak if(names_match(install_name, libraryName) == TRUE)
'un if(strcmp(_dyld_get_image_name(i), libraryName) == 0)
ile değiştiren kendi sürümünüzü oluşturabilirsiniz. Bu, orijinalin tam yol olmadan kitaplık adının beklenmesini, düzeltilmiş sürümün tam yolu beklediği sorunu çözecektir, ancak yüklenen dyliblerde hala arama yapar.
#include <mach-o/dyld.h>
int32_t
library_version(const char* libraryName)
{
unsigned long i, j, n;
struct load_command *load_commands, *lc;
struct dylib_command *dl;
const struct mach_header *mh;
n = _dyld_image_count();
for(i = 0; i < n; i++){
mh = _dyld_get_image_header(i);
if(mh->filetype != MH_DYLIB)
continue;
load_commands = (struct load_command *)
#if __LP64__
((char *)mh + sizeof(struct mach_header_64));
#else
((char *)mh + sizeof(struct mach_header));
#endif
lc = load_commands;
for(j = 0; j < mh->ncmds; j++){
if(lc->cmd == LC_ID_DYLIB){
dl = (struct dylib_command *)lc;
if(strcmp(_dyld_get_image_name(i), libraryName) == 0)
return(dl->dylib.current_version);
}
lc = (struct load_command *)((char *)lc + lc->cmdsize);
}
}
return(-1);
}
Kısmen cevap veriyorsunuz ama yine de bu çözümün bir parçası olmalı bence. – Till
"Bu, şimdi tam adı beklediği sorunu düzeltir" ile ilgili olarak: Adk gerçekten bir sorun olduğunu sanmıyorum, çünkü adk bir kitaplık sürümünü kendi yoluna (adı da içeren) sorgulamaya çalışıyor. –
- 1. Kitaplığın bilinmeyen bir sürümünü dlopen etme
- 2. Dlopen() hata görüntü Önce bir .dylib yükler aşağıdaki komutu kullanarak libFirst.dylib arama sağlar yazılıma sahip
- 3. python programında libxml2.2.dylib referansı
- 4. Scipy.optimize nedeniyle eksik açılamayabilir. Dylib
- 5. 'dlsym' ve 'dlopen'
- 6. grep'i kullanarak parantezleri bulma
- 7. dlopen() arama yolu
- 8. Setenv kullanarak ve sonra dlopen çağrı yapma ile ilgili sorunlar
- 9. Anahtar kartlarını kullanarak anahtarları bulma
- 10. Python kullanarak denklemin sıfırları bulma
- 11. libsqlite3.tbd libsqlite3.dylib ile aynı mı?
- 12. Kompozit kullanarak Laravel'in Eski Sürümünü Kurun
- 13. iOS uygulamasının xcode'un beta sürümünü kullanarak gönderilmesi?
- 14. Paket sürümünü pkg_resources kullanarak mı alıyorsunuz?
- 15. Buildship kullanarak Eclipse'deki Gradle sürümünü nasıl değiştirebilirim?
- 16. Çalışma zamanında dylib yolumu nasıl alabilirim?
- 17. Windows üzerinde JRE'yi bulma
- 18. Tuple çiftleri, python kullanarak minimum bulma
- 19. Java'da Yansıma kullanarak bir Numaralandırma Sınıfı Bulma
- 20. GQL kullanarak bir sütundaki maksimum değeri bulma
- 21. NLTK WordNet Kullanarak Doğru İsimleri Bulma
- 22. Python & OpenCV kullanarak kırmızı renk bulma
- 23. Eşiği kullanarak benzer HEX renklerini bulma
- 24. Python kullanarak ağ (harici) IP adresleri bulma
- 25. İçindek iFrame'i Selenium 2'yi kullanarak bulma
- 26. Verileri kullanarak aralıklar arasındaki boşlukları bulma
- 27. Gidon'ları kullanarak bir nesnenin uzunluğunu bulma Yardımcılar
- 28. ssh mümkün değil (dlopen image found)
- 29. Dlopen() kütüphane yüklenemedi: cairo/cairo-2
- 30. Kodda uygulama sürüm numarasını bulma
Çok daha iyi yanıt, silindi. – EightyEight