Le débogueur pourrait vous le dire (c'est-à-dire le nom d'une fonction, étant donné son adresse).
La table des symboles d'un appareil non dénudé ELF pourrait également vous aider. Voir nm(1) , objdump(1) , readelf(1)
Une autre approche spécifique à Linux GNU/libc pourrait être d'utiliser au moment de l'exécution la fonction dladdr(3) fonction. En supposant que votre programme est bien et dynamiquement lié (par exemple, avec la fonction -rdynamic
), il peut trouver le nom du symbole et le chemin de l'objet partagé à partir d'une adresse (d'une fonction nommée globalement).
Bien sûr, si vous n'avez que cinq fonctions d'une signature donnée, vous pourriez comparer votre adresse (à leurs cinq adresses).
Remarquez que certaines fonctions n'ont pas de nom (globalement visible), par exemple static
fonctions.
Et certaines fonctions pourraient être dlopen
-ed et dlsym
-(par exemple, à l'intérieur des plugins). Ou bien leur code est synthétisé au moment de l'exécution par un cadre JIT ( libjit
, gccjit
, LLVM
, asmjit
). Et le compilateur optimisant peut (et fait !) des fonctions en ligne, clonez-les, appel de la queue etc.... donc votre question peut ne pas avoir de sens en général...
Voir aussi backtrace(3) & Ian Taylor libbacktrace à l'intérieur de GCC.
Mais en général, votre quête est impossible. Si vous avez vraiment besoin de telles informations réfléchies de manière fiable, gérez-les vous-même (consultez Le CAIA de Pitrat système à titre d'exemple, ou en quelque sorte mon MELT ), peut-être en générant du code pendant la construction.