C++ 如何获取函数的原始地址?

C++ 如何获取函数的原始地址?,c++,c,assembly,C++,C,Assembly,我正在编写一个Jit编译器,需要根据其(偏移量)地址从程序集调用一个函数。即,鉴于: void myfunction() { } 我希望能够得到这个函数的实际地址,这样我就可以通过程序集的偏移量来调用它。我尝试了几件事,但得到了不同的答案: void *address1 = (void *&)myfunction; void (*address2)() = &myfunction; cout << &address1 << endl; // 0

我正在编写一个Jit编译器,需要根据其(偏移量)地址从程序集调用一个函数。即,鉴于:

void myfunction() { }
我希望能够得到这个函数的实际地址,这样我就可以通过程序集的偏移量来调用它。我尝试了几件事,但得到了不同的答案:

void *address1 = (void *&)myfunction;
void (*address2)() = &myfunction;

cout << &address1 << endl; // 0x7fff5fbff800
cout << &(*address1) << endl; // 0x20ec8348e5894855
cout << &(address2) << endl; // 0x7fff5fbff808
因此,正确的答案似乎是:

cout << (void *)(void (*)())myfunction << endl; // 0x10000fd70

cout要获取函数的内存地址,请使用不带括号的函数名

void f(); 
void (*p_fun)() = f;
您可以选择包括一个符号和:

void f(); 
void (*p_fun)() = & f;
因此,对于您的问题,
address2
指向函数,要打印出其地址,请使用

cout << address2 << endl;
cout正确的是

 cout << &(*address1) << endl; // 0x20ec8348e5894855

<代码> CUT> P>在C++中没有标准的方法,因为标准不定义从指针到整数或非函数指针的任何转换,或者除了将它们解释为真/假之外,也不定义任何用于打印函数指针的行为,函数指针总是真的(非空)。函数指针不用于打印或从程序导出

在C语言中,可以将函数指针转换为
uintptr\t
,并打印:

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
…
    printf("0x%" PRIxPTR "\n", (uintptr_t) myfunction);
#包括
#包括
#包括
…
printf(“0x%”PRIxPTR“\n”,(uintpttr\u t)myfunction);
<>一些C++实现将允许您将函数指针转换为其他类型指针或整数类型。您应该确保这些转换执行的转换在您依赖之前使用C++实现。在一些实现中,函数指针的值可能不是实际代码的地址;它可能是函数描述符的地址。在这种情况下,分支到地址将不起作用;您需要符合平台对调用函数的要求

打印一个函数的地址以供在其他程序中进一步使用的可能性很小。使用打印地址调用函数通常需要使用新代码重新编译程序,新代码使用从打印派生的地址,更改程序然后重新编译可能会更改函数的地址。从程序集调用函数的通常方式是,通过正常的链接机制(在程序集中按名称引用函数并让链接器解析引用)或将指向函数的指针作为参数传递给程序集例程,将其地址提供给其他程序集代码


另一种选择是将函数放在一个动态库中,在这种情况下,它的地址可以通过动态加载器的特性来查找,例如<代码> dLysM例程。

<代码>和(*ADADES1)<代码>无效,C++ >代码> ADDRES1是类型<代码> VUL*。但它给出了正确的答案。我想我支持安德烈亚斯。这似乎是唯一一个给出合理答案的。在c中,取消引用void不是有效的吗?
std::cout你被否决了吗(不是被我否决了),但我感觉这是正确的。我在上面更新的原始帖子中找到了正确答案,但现在我想知道0x20xxxxxxxx指的是什么?我错投了否决票,我会做一个简单的编辑,这样我就可以删除否决票了。在C++中没有有效的方法来引用<代码>空白> /COD>。只要
address1
是type
void*
你的答案就错了。@CaptainObvlious:好吧,这是对原始问题的引用。显然,这个表达式使用C++编译器扩展(在C99空指针被处理成char指针,这是合法的),语义上有点模糊。我不明白为什么声称这是“错误的”与原始问题相关。这似乎只是给了我指向函数的指针的地址,而不是函数本身。
&address2
是变量
address2
的地址,而不是
address2
所指对象的地址to@Cramer更新。谢谢
 cout << &(*address1) << endl; // 0x20ec8348e5894855
 cout << address1 << endl; 
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
…
    printf("0x%" PRIxPTR "\n", (uintptr_t) myfunction);