2013-01-10 106 views
3

我想知道是否有可能在函數中暴露的goto標籤,從符號表中的C/C++暴露轉到標籤符號表

舉例來說,我要讓RET下面的代碼片斷的標籤從符號表中出現,並可以使用標準API(如dlsym())進行引用。

感謝您的幫助提前!

#include <stdio.h> 

int main() { 
    void *ret_p = &&ret; 
    printf("ret: %p\n", ret_p); 
    goto *ret_p; 

    return 1; 

    ret: 
    return 0; 
} 
+0

簡直不可能(你的代碼不是標準的C++和AFAIK,它也不是標準的C - 但你可能知道這一點)。 –

+3

您可以使用內聯asm來添加彙編器希望指示符號的任何代碼。 (順便說一句,&& ret是一個gcc擴展,我認爲,你可能想要添加一個gcc標籤) –

+0

@KonradRudolph是的你是對的Konrad,計算的goto不是標準的一部分。不過,我正在尋找一個適用於gcc(或clang)的解決方案。 – kjee

回答

3

由於Marc Glisse「的評論是關於使用內聯彙編指定標籤,我能想出的問題的解決方法。以下示例代碼片段顯示了我如何解決問題。

#include <stdio.h> 

int main() { 
    void *ret_p = &&ret; 
    printf("ret: %p\n", ret_p); 
    goto *ret_p; 

    return 1; 

    ret: 
    asm("RET:") 

    return 0; 
} 

這將添加符號表條目,如下所示。

[email protected]:~$ gcc -Wl,--export-dynamic t.c -ldl 
[email protected]:~$ readelf -s a.out 

39: 08048620  0 FUNC LOCAL DEFAULT 13 __do_global_ctors_aux 
40: 00000000  0 FILE LOCAL DEFAULT ABS t.c 
41: 0804858a  0 NOTYPE LOCAL DEFAULT 13 RET 
42: 08048612  0 FUNC LOCAL DEFAULT 13 __i686.get_pc_thunk.bx 
43: 08049f20  0 OBJECT LOCAL DEFAULT 19 __DTOR_END__ 

[email protected]:~$ ./a.out 
ret: 0x804858a 

我會進一步測試這個解決方法,驗證是否會產生任何意想不到的副作用。

謝謝