Над ответом является очень усложненной. Если опорная функция является статическим, так как она выше , адрес просто значение имени символа в контексте указателя:
void* myfunction_address = myfunction;
Если вы захватывая функцию динамически из общей библиотеки, то возвращается значение из dlsym() (POSIX) или G etProcAddress() (windows) также является адресом функции.
Обратите внимание, что приведенный выше код, вероятно, генерирует предупреждение с некоторыми компиляторами, поскольку ISO C технически запрещает назначение между указателями кода и данных (некоторые архитектуры помещают их в физически различные адресные пространства).
И некоторые педанты укажут, что возвращенный адрес не действительно гарантированно будет адресом памяти функции, это просто уникальное значение, которое можно сравнить для равенства с другими указателями и действиями функций, , чтобы передать управление функции, указатель которой она удерживает. Очевидно, что все известные компиляторы реализуют это с целевым адресом филиала.
И, наконец, обратите внимание, что «адрес» функции немного неоднозначен. Если функция была загружена динамически или является ссылкой extern на экспортированный символ, то, что вы действительно получаете, обычно является указателем на некоторый код исправления в «PLT» (термин Unix/ELF, хотя механизм PE/COFF на окнах аналогичен), который затем переходит к функции.
Вы спрашиваете о дизассемблере времени выполнения, встроенном в вашу программу? – 2009-07-01 15:52:35
Что вы действительно хотите? –
Спасибо всем. У меня есть хорошее понимание этого вопроса: D – wakandan