2008-09-15 14 views
1

C paylaşılan kitaplığından isteğe bağlı işlevleri çağırmak için küçük bir yardımcı program yazmak istiyorum. Kullanıcı, verilen tüm işlevleri objdump veya nm'nin yaptığı gibi listeleyebilmelidir. Bu yardımcı programların kaynağını kontrol ettim ama korkutucular. Dl kitaplığı bu işlevselliğe sahipse, google hakkında yeterli bilgi bulamadı.Çapraz platformda bir c ikilisinin işlev adlarını aramanın en kolay yolu nedir?

(Açıklama düzenleme:. Sadece önceden bilinen bir işlevi çağırmak istemiyorum Cevabını boyunca örnek bir parçasını takdir edeceklerdir.)

cevap

2

Bu aradığınızı yakın olabilir: http://python.net/crew/theller/ctypes/

+0

Klişe ile, sayı ve tür argümanlarının ne zaman olduğunu bilmek zorundasınız. Bu OP ile 'açıklık düzenlemesine' karşı geliyor. Bak: http://python.net/crew/theller/ctypes/tutorial.html#specifying-the-required-argument-types-function-prototypes – Kevin

2

Windows hakkında biraz konuşacağım. DLL'lerden dışa aktarılan C işlevleri, türlerin, adların veya argümanların sayısı hakkında bilgi içermez - veya verilen bir işlev için çağrı kuralının ne olduğunu belirleyebileceğine inanıyorum.

Karşılaştırmak için, National Instrument'ın LabVIEW programlama ortamına bir göz atın. İşlevleri DLL'den içe aktarabilirsiniz, ancak belirli bir işlevi kullanmadan önce bağımsız değişkenlerin türlerini ve adlarını elle yazmanız gerekir. Bu sınırlama tamamsa, lütfen bunu yansıtmak için sorunuzu düzenleyin.

* Nix ortamlarında neyin mümkün olduğunu bilmiyorum.

DÜZENLEME: Açıklamanızla ilgili olarak. Eğer fonksiyonun ne zaman olduğunu bilemezseniz, Windows'a hapsolursunuz, çünkü genel olarak fonksiyonların aldığı argüman ve sayıların ne olduğunu belirleyemezsiniz.

+0

Stdcall yapmak zorunda değilim, bu yüzden yok ' Çağrı yığını hakkında endişeleniyorum. Hatırlayabildiğim kadarıyla dll dosyaları, karışık adlar gibi dışa aktarılan işlevlerle ilgili bazı bilgileri hala korur. – artificialidiot

+0

Mangled isimleri korunur ve C++ kütüphaneleri için argüman bilgilerini söyler (isimleri nasıl çözeceğinizi bildiğinizi varsayarsak). Ama OP "C" olarak belirlendi. MSVC bazen çağrıları çağırmak için C adlarını ve argümanların toplam boyutunu bayt cinsinden yönetir - ancak yine de kritik bilgilerden yoksunuz. – Kevin

1

ParaDyn'in SymtabAPI'sini deneyebilirsiniz. Paylaşılan kitaplıktaki (veya yürütülebilir) tüm simgeleri yakalamanıza ve türlerine, ofsetlerine vb. Bakmanıza izin verir. Hepsi oldukça güzel bir C++ arabirimine sarılır ve çok sayıda platformda çalışır. Ayrıca, çalışma zamanında konuştuğunuz şeyi yapmak için potansiyel olarak kullanabileceğiniz ikili yeniden yazma desteği de sağlar.

Web burada:

http://www.paradyn.org/html/symtab2.1-features.html

Belgeleri burada:

http://ftp.cs.wisc.edu/paradyn/releases/release5.2/doc/symtabProgGuide.21.pdf

1

standart ish API Dlopen/dlsym API; AFAIK, Linux ve Mac OS X'in standart C kütüphanesinde (libSystem) GNU libc tarafından uygulanmaktadır ve Windows'da MinGW veya diğer uyumluluk paketleri ile uygulanabilir.

+0

, bu API'yi kullanarak bir örnek verebilir mi? – artificialidiot

+0

Yeni bir StackOverflow sorusu veya sadece googling sormayı deneyin. dlopen() Windows'ta mevcut değildir, ancak LoadLibrary() benzer işlevler sunar. –

0

nm ve objdump için kaynak kodu kullanılabilir. Spesifikasyondan başlamak istiyorsanız, ELF içine bakmak istediğiniz şeydir.

/Allan

-1

Eek! Platforma bağlı olan çok sayıdaki programlama konularından birine değindiniz. Pencerelerde, linux üzerinde DLL dosyanız var, ld.so, ld-linux.so ve mac os x dyld.

+0

Üzgünüm, hiç yardımcı olmuyorsunuz – artificialidiot

0

Perl'de böyle bir şey yazdım. Win32 üzerinde POSIX üzerinde dumpbin/export'u çalıştırır, nm-gP'yi çalıştırır. Daha sonra, Perl olduğu için, sonuçlar normal ifadeler kullanılarak yorumlanır: Win32 (stdcall işlevleri) için/_ (\ S +) @ \ d +/ve POSIX için/^ (\ S +) T /.

1

Sadece mantıklı çözüm (tekerleği yeniden keşfetmeden) libbfd kullanıyor gibi görünüyor.Downsides, belgelerinin az olduğu ve benim amaçları için biraz şişirilmiş.

İlgili konular