添加到函数指针,获取指向另一个函数的指针?

时间:2014-11-21 04:57:46

标签: c ruby function-pointers addition

我一直在摆弄功能指针,我有两个特定的功能,我已经打印到控制台;结果表明它们是8字节appart,如下所示:

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

我可以简单地获取第一个函数指针,向该指针添加8,并指向第二个函数吗?

背景故事: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?
}

我很可能在这里看起来很傻,但是获得第二个功能的任何帮助都会非常有用。

1 个答案:

答案 0 :(得分:0)

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

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

  

28指向void的指针应具有相同的表示和对齐方式   要求作为指向字符类型的指针.48)同样,指针   合格或不合格版本的兼容类型应具备   相同的表示和对齐要求。所有指针   结构类型应具有相同的表示和对齐方式   彼此的要求。所有指向union类型的指针都应该有   相同的表示和对齐要求。   指向其他类型的指针不需要具有相同的表示或对齐要求。

和(6.3.2.3指针)

  

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