2014-11-21 168 views
1

我一直在摆弄函数指针,我有两个具体的功能,我打印到控制台;结果说他们是8个字节APPART,就像这样:添加到函数指针,获取指向另一个函数的指针?

Function Pointer Addresses: 
rb_gc_start addr: 0x6ea81360 
rb_gc_mark addr: 0x6ea81368 

难道我只是得到一个函数指针第一,增加8到指针,并有一个指针第二个函数?

Backstory:在Ruby的源文件中有两个函数,rb_gc_startrb_gc_mark;我正在为一个困难的计划建立一个图书馆。该程序嵌入了Ruby,但不嵌入Ruby C API(它禁止加载Ruby扩展或* .so文件)。我几乎重新创建了环境,并且我可以直接获取rb_gc_start的地址,但rb_gc_mark并不那么容易被公开,我需要一个指向它的指针才能正常工作。

例如:

unsigned long (*rb_gc_start)(void); 
void (*rb_gc_mark)(unsigned long); 

void my_method(void) { 
    rb_gc_start = get_method(rb_mGC, "start"); // 0x6ea81360; 
    rb_gc_mark = rb_gc_start + 8; // Does this work? 
} 

我最有可能看这里的傻瓜,但获得的第二个功能是最有帮助的任何帮助。

+0

'func1_ptr'从哪里来? – bwinata 2014-11-21 05:01:27

+0

对不起,我在最后一分钟重新命名了这些函数以提供更多的上下文;它应该是'rb_gc_start'。 – FenixFyreX 2014-11-21 05:03:30

回答

0

如果函数指针不在同一个函数指针数组中,则不可以这样做。指针和整数值的加法运算符仅对数组中的指针有效。一个对象被认为是一个元素的数组。

还要考虑到的是,根据C标准(6.2.5类型)

28的指针中的孔隙应具有相同的表示和对准 要求一个指向字符type.48)同样,指向合格或不合格版本的兼容类型的指针 应具有相同的表示和对齐要求。所有指向 结构类型的指针都应具有相同的表示形式和对齐要求。所有指向联合类型的指针应具有相同的表示和对齐要求。 指向其他类型的指针不需要具有相同的表示或对齐要求。

和(6.3.2.3指针)

8所述的指针一种类型的功能可以被转换为一个指向 另一种类型的,然后再返回的函数;结果应该比较 等于原始指针。 如果使用转换的指针 调用其类型与引用类型 不兼容的函数,则行为未定义。

+0

有什么可以建议我做的吗? Ruby环境是嵌入到他们程序中的dll,所以我无法访问它;有没有办法获得该功能的句柄? – FenixFyreX 2014-11-21 16:48:01

+0

@FenixFyreX该函数具有不兼容的类型,所以我甚至不知道该建议什么。 – 2014-11-21 16:51:28