2014-01-16 91 views
0

我想在OpenCL for ARM GPU - Mali中構建我的程序。尚未解決的符號的另一個鏈接問題

我有一個圖書館libMali.so,其中包含必要的符號:

arm-v7a15v4r3-linux-gnueabi-nm *root_to_lib*/libMali.so

返回線,如

002525b4 t clCreateKernel

和許多其他所有預期的OpenCL的符號。

然而,隨着

arm-v7a15v4r3-linux-gnueabi-g++ -c -Wall mandelbrot.cpp -o mandelbrot.o

arm-v7a15v4r3-linux-gnueabi-g++ mandelbrot.o -o mandelbrot -L*root_to_lib* -lMali

編譯帶給我喜歡

mandelbrot.cpp:(.text+0x2e4): undefined reference to clCreateKernel'`

錯誤和其他所有的符號,這是在實際存在libMali.so!

所以,我在鏈接命令中保留了librabies的正確順序,庫在指定的路徑上(它確實是)並且它具有符號。 在這種情況下,Mangling也不是問題:使用extern C說明符,您可以看到lib和object文件的原始條目未被損壞。 嘗試使用arm-v7a15v4r3-linux-gnueabi-gcc完成同樣的事情除了需要手動鏈接更多的C++庫(使用-L * path * -llib)之外,沒有帶來任何改變。 libMali.so由arm-v7a15v4r3-linux-gnueabi-g++/gcc/ld構建,所以這不是工具鏈版本的問題。

我已經跑出了想法。可能有人在這裏知道更多棘手的部分鏈接過程?

編輯: 實際上,mandelbrot.cpp是來自Mali-SDK的示例代碼。我只是在這個例子中顯示了我的鏈接器問題,因爲代碼中顯然沒有問題。你可以在這裏看到的代碼:

http://malideveloper.arm.com/downloads/deved/tutorial/SDK/opencl/mandelbrot_8cpp_source.html

http://malideveloper.arm.com/downloads/deved/tutorial/SDK/opencl/mandelbrot_8cl_source.html

+0

你可以發佈實際的代碼(也許只是一個簡單的例子,只是做一個基本的內核,並足夠的clCreateKernel調用)。我每天都這樣做,每天都這樣,所以這可能很簡單,但沒有看到實際的代碼出錯,很難說。 –

+0

@MatsPetersson mandelbrot.cpp是來自Mali-SDK的示例代碼。我沒有改變它 - 我只是現在測試功能。代碼的編譯階段已成功傳遞,唯一的問題是鏈接 - 由於某些原因,鏈接器看不到符號。 – user3176112

+0

在鏈接命令中使用'-Wl, - verbose'(注意:在選項中沒有空格)告訴鏈接器轉儲有關正在搜索的庫的信息,以確保該工具正在查看您期望的文件至。 –

回答

0

如果在nm輸出密切關注:

002525b4 t clCreateKernel 

,你會發現,符號標有小寫't'這表明該符號具有本地綁定(例如靜態函數),因此不考慮綁定到另一個對象文件中的未定義符號。您可以在這裏找到大部分隱含的「符號類型」字母的解釋:nm這裏:https://sourceware.org/binutils/docs/binutils/nm.html

readelf實用程序的輸出更清楚符號類型。

也許庫的構建不正確?

+0

哇,你是對的!我實際上並不知道小寫的't'代表本地符號,只知道它暗示了文本/代碼部分。 'arm-v7a15v4r3-linux-gnueabi-readelf'的輸出給出了諸如'106586:002525b5 66 FUNC LOCAL DEFAULT 11 clCreateKernel' – user3176112

+0

@ user3176112這樣的行:那麼你知道它們爲什麼被標記爲本地嗎?我對Mali(或OpenCL)並不熟悉,但它看起來像是在Google上彈出的那個'clCreateKernel()'旨在從用戶代碼中調用的東西。 –

+0

實際上不知道。但我會聯繫實際從源代碼構建它的開發人員。我想這只是他們身上的一個愚蠢的錯誤。當然,這些符號應該是可以訪問的,這就是擁有一個圖書館的關鍵。 – user3176112