2008-09-15 2 views
1

Je veux écrire un petit utilitaire pour appeler des fonctions arbitraires d'une bibliothèque partagée C. L'utilisateur devrait pouvoir énumérer toutes les fonctions exportées semblables à ce que fait objdump ou nm. J'ai vérifié la source de ces services mais ils sont intimidants. Impossible de trouver suffisamment d'informations sur google, si la bibliothèque dl a cette fonctionnalité non plus.Quel est le moyen le plus simple de rechercher les noms de fonctions d'un binaire c de manière multiplateforme?

(Précision modifier. Je ne veux pas simplement appeler une fonction qui est connu à l'avance, j'apprécie un fragment d'exemple le long de votre réponse.)

Répondre

2

Cela pourrait être proche de ce que vous cherchez: http://python.net/crew/theller/ctypes/

+0

Avec les types ctypes, vous devez connaître le nombre et les types d'arguments à l'avance. Cela va à l'encontre de la "clarification" du PO. Voir: http://python.net/crew/theller/ctypes/tutorial.html#specifying-the-required-argument-types-function-prototypes – Kevin

2

Eh bien, je parlerai un peu de Windows. Les fonctions C exportées à partir de DLL ne contiennent pas d'informations sur les types, les noms ou le nombre d'arguments. Je ne crois pas non plus que vous puissiez déterminer la convention d'appel pour une fonction donnée.

Pour la comparaison, jetez un oeil à l'environnement de programmation LabVIEW de National Instrument. Vous pouvez importer des fonctions à partir de DLL, mais vous devez entrer manuellement le type et les noms des arguments avant d'utiliser une fonction donnée. Si cette limite est OK, veuillez modifier votre question pour refléter cela.

Je ne sais pas ce qui est possible avec les environnements * nix.

EDIT: Concernant votre clarification. Si vous ne savez pas quelle est la fonction à l'avance, vous êtes plutôt foutu sur Windows, car en général, vous ne pourrez pas déterminer le nombre et le type d'arguments que prennent les fonctions.

+0

Je n'ai pas besoin de faire un appel stdcall donc je ne fais pas Ne vous inquiétez pas de la pile d'appels. Autant que je me souvienne, les fichiers dll conserve encore des informations sur les fonctions exportées comme les noms mutilés. – artificialidiot

+0

Les noms partagés sont conservés et peuvent vous indiquer les informations d'argument pour les bibliothèques C++ (en supposant que vous sachiez comment annuler le démontage des noms). Mais l'OP a spécifié "C". MSVC supprime parfois les noms C pour la convention d'appel et la taille totale des arguments en octets - mais vous manquez toujours d'informations critiques. – Kevin

1

Vous pouvez essayer le SymtabAPI de ParaDyn. Il vous permet de saisir tous les symboles d'une bibliothèque partagée (ou d'un exécutable) et de voir leurs types, leur offset, etc. Tout est enveloppé dans une interface C++ raisonnablement agréable et fonctionne sur beaucoup de plates-formes. Il fournit également un support pour la réécriture binaire, que vous pourriez éventuellement utiliser pour faire ce dont vous parlez à l'exécution.

page Web est ici:

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

Documentation est ici:

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

1

Une API standard ish est l'API dlopen/dlsym; AFAIK il est implémenté par GNU libc sur Linux et la bibliothèque C standard de Mac OS X (libSystem), et il pourrait être implémenté sur Windows par MinGW ou d'autres paquets de compatibilité.

+0

quelqu'un peut-il fournir un exemple en utilisant cette API? – artificialidiot

+0

Essayez de poser une nouvelle question sur StackOverflow ou simplement de googler. dlopen() n'est pas disponible sous Windows, mais LoadLibrary() offre des fonctionnalités similaires. –

0

Le code source pour nm et objdump est disponible. Si vous voulez partir de spécification, alors ELF est ce que vous voulez regarder.

/Allan

-1

Eek! Vous avez abordé l'un des sujets de programmation les plus dépendants de la plateforme. Sur les fenêtres, vous avez des DLL, sur Linux, vous avez ld.so, ld-linux.so, et dyld de mac os x.

+0

désolé vous ne aidez pas du tout – artificialidiot

0

J'ai écrit quelque chose comme ça en Perl. Sur Win32, il exécute dumpbin/exports, sur POSIX, il exécute nm -gP. Puis, comme c'est Perl, les résultats sont interprétés en utilisant des expressions régulières:/_ (\ S +) @ \ d +/pour Win32 (fonctions stdcall) et/^ (\ S +) T/pour POSIX.

1

Seule une solution sensible (sans réinventer la roue) semble utiliser libbfd.Les inconvénients sont sa documentation est rare et il est un peu gonflé pour mes fins.

Questions connexes