我有一个C源文件,我不允许更改,定义如下:
int main(int argc, char *argv[])
{
//doing something
return 0
}
void __magic()
{
__asm__("jmp %esp");
}
我的代码中没有使用fucntion __magic,它只是在main之后声明的。 我希望找到函数 __ magic 的地址。 如何在不必在main之前声明功能的情况下执行此操作? 我使用gdb进行调试。
P.S 我还想知道这个函数是否甚至保存在我的进程内存中,因为它没有声明/使用它。编译器可能只是没有添加该功能吗?
答案 0 :(得分:1)
您需要通过“查找函数__magic
的地址”来澄清您的具体含义。如果您只想查看地址是什么(即不在代码中使用它),那么您只需使用objdump
来显示符号值。
但是,如果在编译时需要地址,那么就没有简单的方法可以做到。无法保证编译器会以任何特定的顺序放置函数的代码,即使这样做,也可能在函数之间存在未知量的填充。由于您使用的是%esp
,我认为您的目标是32位x86 - 如果您的目标是64位,那么您还必须担心ASLR。
答案 1 :(得分:-1)
在main之前简单地为你的函数定义一个原型,这是专业人员用来总结他们努力的好方法
void ___magic(); // it is a prototype definition
int main(int argc, char *argv[])
{
//doing something
return 0
}
void __magic()
{
__asm__("jmp %esp");
}