我一直在摆弄功能指针,我有两个特定的功能,我已经打印到控制台;结果表明它们是8字节appart,如下所示:
Function Pointer Addresses:
rb_gc_start addr: 0x6ea81360
rb_gc_mark addr: 0x6ea81368
我可以简单地获取第一个函数指针,向该指针添加8,并指向第二个函数吗?
背景故事:Ruby的源代码rb_gc_start
和rb_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 :(得分:0)
如果函数指针不在同一个函数指针数组中,则可能不会这样做。指针和整数值的加法运算符仅对数组中的指针有效。单个对象被视为具有一个元素的数组。
还要考虑到根据C标准(6.2.5类型)
28指向void的指针应具有相同的表示和对齐方式 要求作为指向字符类型的指针.48)同样,指针 合格或不合格版本的兼容类型应具备 相同的表示和对齐要求。所有指针 结构类型应具有相同的表示和对齐方式 彼此的要求。所有指向union类型的指针都应该有 相同的表示和对齐要求。 指向其他类型的指针不需要具有相同的表示或对齐要求。
和(6.3.2.3指针)
8指向一种类型的函数的指针可以转换为指向的指针 另一种类型的功能又回来了;结果应该比较 等于原始指针。 如果使用转换后的指针 调用一个类型与引用类型不兼容的函数, 行为未定义。