Доступ к функции, определенной после основного
У меня есть исходный файл C, который мне не разрешено изменять, и он определяется следующим образом:
int main(int argc, char *argv[])
{
//doing something
return 0
}
void __magic()
{
__asm__("jmp %esp");
}
Я не использую fucntion __magic в своем коде, он объявлен только после основного. Я хочу найти адрес функции __magic. Как я могу это сделать, не объявляя функцию перед основной? Я использую GDB для целей отладки.
PS Я также хотел бы знать, сохраняется ли эта функция даже в моей памяти процесса, так как ее не объявляют / не используют. может ли компилятор просто не добавить эту функцию?
2 ответа
Вам нужно уточнить, что именно вы подразумеваете под "найти адрес функции __magic
Msgstr ". Если вы просто хотите увидеть, что это за адрес (т.е. не используете его в коде), то вы можете просто использовать objdump
показать значение символа.
Однако, если вам нужен адрес во время компиляции, то нет простого способа сделать это. Нет никакой гарантии, что компилятор разместит код для функций в каком-то определенном порядке, и даже если это произойдет, между функциями может быть неизвестное количество заполнения. Так как вы используете %esp
Я предполагаю, что вы нацеливаетесь на 32-битную x86 - если вы нацеливаетесь на 64-битную, то вам также придется беспокоиться о ASLR.
Просто определите прототип для ваших функций перед основным, это хороший способ, которым профессионалы используют для подведения итогов своих усилий
void ___magic(); // it is a prototype definition
int main(int argc, char *argv[])
{
//doing something
return 0
}
void __magic()
{
__asm__("jmp %esp");
}