Доступ к функции, определенной после основного

У меня есть исходный файл C, который мне не разрешено изменять, и он определяется следующим образом:

int main(int argc, char *argv[])
{
    //doing something
    return 0
}

void __magic()
{
    __asm__("jmp %esp");
}

Я не использую fucntion __magic в своем коде, он объявлен только после основного. Я хочу найти адрес функции __magic. Как я могу это сделать, не объявляя функцию перед основной? Я использую GDB для целей отладки.

PS Я также хотел бы знать, сохраняется ли эта функция даже в моей памяти процесса, так как ее не объявляют / не используют. может ли компилятор просто не добавить эту функцию?

2 ответа

Решение

Вам нужно уточнить, что именно вы подразумеваете под "найти адрес функции __magicMsgstr ". Если вы просто хотите увидеть, что это за адрес (т.е. не используете его в коде), то вы можете просто использовать 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");
}
Другие вопросы по тегам