2014-11-21 165 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