c++使用dlsym

翻閱android源碼時,發現以下代碼:
          CreateSoftOMXComponentFunc createSoftOMXComponent =
            (CreateSoftOMXComponentFunc)dlsym(
                    libHandle,
                    "_Z22createSoftOMXComponentPKcPK16OMX_CALLBACKTYPE"
                    "PvPP17OMX_COMPONENTTYPE");

看到"_Z22createSoftOMXComponentPKcPK16OMX_CALLBACKTYPE"比較納悶,這是個啥?
C語言裏不都是直接dlsym("createSoftOMXComponent")這麼打開的嗎?爲啥出來一堆亂碼?


查到這麼一句話:
  在每個C++程序(或庫、目標文件)中,所有非靜態(non-static)函數在二進制文件中都是以“符號(symbol)”形式出現的。這些符號都是唯一的字符串,從而把各個函數在程序、庫、目標文件中區分開來。
  在C中,符號名正是函數名:strcpy函數的符號名就是“strcpy”,等等。這可能是因爲兩個非靜態函數的名字一定各不相同的緣故。
  而C++允許重載(不同的函數有相同的名字但不同的參數),並且有很多C所沒有的特性──比如類、成員函數、異常說明──幾乎不可能直接用函數名作符號名。爲了解決這個問題,C++採用了所謂的name mangling。它把函數名和一些信息(如參數數量和大小)雜糅在一起,改造成奇形怪狀,只有編譯器才懂的符號名。例如,被mangle後的foo可能看起來像foo@4%6^,或者,符號名裏頭甚至不包括“foo”。
  其中一個問題是,C++標準(目前是[ISO14882])並沒有定義名字必須如何被mangle,所以每個編譯器都按自己的方式來進行name mangling。有些編譯器甚至在不同版本間更換mangling算法(尤其是g++ 2.x和3.x)。即使您搞清楚了您的編譯器到底怎麼進行mangling的,從而可以用dlsym調用函數了,但可能僅僅限於您手頭的這個編譯器而已,而無法在下一版編譯器下工作。


原來是由於C++的重載,只使用函數名會查到很多同名函數,不唯一。所以需要將型參和返回值一起加進來。
原來google的程序員也是如此的簡單粗暴。。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章