Est-il possible pour un programme écrit en C (ou assembly) et est lié avec c stdlib en utilisant gcc pour imprimer l'adresse de son entrée? (Puisque le symbole _start indique l'entrée du programme, je demande s'il est possible d'imprimer l'adresse de ce symbole depuis la fonction principale sans utiliser l'analyse du fichier exécutable ELF.)?Auto-identification d'entrée de programme
Répondre
Pas très portable (c.-à-fonctionne sur ma machine, mais peut-être que c'est parce que les étoiles sont alignées)
#include <stdio.h>
extern void _start();
int main(int argc,char *argv[])
{
printf("%p\n",_start);
return 0;
}
Sur une boîte x86_64 RHEL 5.5, l'adresse imprimée correspond au point d'entrée d'adresse dans l'en-tête elfe, Je ne serais pas surpris si cela explose si le binaire est construit pour utiliser la randomisation de l'espace adresse.
Oui, ça fonctionne, merci! Comment j'ajoute la randomisation de l'espace adresse? –
Je demande pourquoi vous avez besoin de faire cela, mais avez-vous essayé d'utiliser dlsym
à vos fins?
Je voulais juste savoir si cela peut être fait, je ne sais pas si cela a un aspect pratique. Quelle est la section dlsym dans ELF? –
dlsym est une fonction qui vous renvoie une adresse basée sur le nom du symbole. par exemple. void * p = dlsym (handle, "_ start"); – nos
Pas de manière portable, non. En utilisant l'assembly pour une plate-forme connue, vous pouvez probablement revenir en arrière sur la pile d'appels et écrire l'adresse de retour (qui devrait se trouver dans la routine _start
, si votre plateforme l'utilise) vers une variable accessible depuis le côté C.
Bien sûr, alors vous n'avez l'adresse de l'instruction suivante du call
à votre main()
, pas le début de la routine _start
.
extern void _start();
printf("%p\n", (void *)_start);
Ce n'est pas « portable » dans le sens que le langage C définit pas une telle chose en fonction _start
, mais en supposant qu'il est mis en œuvre de cette façon, cela devrait fonctionner.
- 1. Programme de plantages d'insertion de programme
- 2. si autre programme pour changer de programme
- 3. programme java programme
- 4. Liaison de programme NetBeans
- 5. C# question de programme
- 6. Exception de programme C#
- 7. Programme de surveillance imprimer
- 8. C# question de programme
- 9. pile de programme alternatif
- 10. programme de jeu opengl
- 11. Conception de programme C++
- 12. Programme de convertisseur d'unité
- 13. programme de chaîne C
- 14. programme d'édition de texte
- 15. Exécution d'un programme d'installation ou vérification de l'installation d'un programme
- 16. Conversion d'un programme parallèle en programme de cluster. D'OpenMP à?
- 17. Créer un programme d'installation de programme dans Visual Studio 2005?
- 18. Programme de génération de fichiers?
- 19. Un programme qui crée un autre programme
- 20. XtraScheduler créer un rendez-programme par programme
- 21. Exécution d'un programme dans un autre programme?
- 22. Exécution d'un programme par programme .NET
- 23. Test pour un programme que je programme
- 24. Programme de synchronisation sans fil
- 25. Activation par programme de NSMenuItem
- 26. Programme de capture d'écran efficace
- 27. Contrôle par programme de Firefox
- 28. Erreur de programme vecteur simple
- 29. Ruby Erreur de programme: NoMethodError
- 30. Exécution du programme de temporisation
Vous pouvez utiliser des composants intégrés pour obtenir une adresse dans la fonction d'entrée à partir de la trame de la pile, mais pas l'adresse de début. http://gcc.gnu.org/onlinedocs/gcc/Return-Address.html Pourquoi voulez-vous l'adresse de départ? – Rup
'& main'? ....... – khachik