免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

ARM Mali GPU鏈接實(shí)戰(zhàn):交叉編譯與libmali動(dòng)態(tài)庫加載指南

ARM Mali GPU鏈接實(shí)戰(zhàn):交叉編譯與libmali動(dòng)態(tài)庫加載指南 記得很多年前第一次把 OpenGL ES 程序跑在 ARM Linux 開發(fā)板上時(shí)卡在的不是shader寫錯(cuò)了而是程序一啟動(dòng)就報(bào)錯(cuò)找不到libmali.so。那時(shí)還沒有現(xiàn)在這么多現(xiàn)成工具鏈我折騰了一整天才弄明白所謂“ARM Mali GPU links”主要就是三條線交叉編譯鏈怎么選、GPU 用戶態(tài)驅(qū)動(dòng)庫怎么鏈接、運(yùn)行時(shí)怎么把libmali加載進(jìn)進(jìn)程。搞清楚這三條線你在 RK3399、RK3568、樹莓派或者飛騰平臺(tái)上調(diào) Mali 顯卡基本就是順?biāo)浦鄣氖隆_@篇內(nèi)容我按自己實(shí)際踩坑的順序整理先講整體思路和工具鏈選型再講編譯鏈接時(shí)的具體操作接著講運(yùn)行時(shí)動(dòng)態(tài)庫加載最后是問題排查速查表。內(nèi)容適合剛把 SDL/EGL/OpenGL ES 項(xiàng)目往 ARM 板上移植的開發(fā)者也適合想搞明白 “export LD_LIBRARY_PATH/usr/lib/aarch64-linux-gnu/mali”這行命令到底干了啥的運(yùn)維和 AI 部署工程師。1. 整體設(shè)計(jì)思路Mali 平臺(tái)上的“鏈接”到底在鏈接什么1.1 鏈接的本質(zhì)是讓 GPU 用戶態(tài)驅(qū)動(dòng)與你的應(yīng)用“對(duì)上話”ARM Mali 的 GPU 架構(gòu)里有一個(gè)非常明確的分工內(nèi)核側(cè)有 kbase/mali 驅(qū)動(dòng)用戶態(tài)側(cè)有 libmali.so。你的應(yīng)用程序不管是 EGLC 客戶端、Wayland compositor還是直接掉 OpenGL ES 的圖形程序在調(diào) EGL/GLES API 時(shí)實(shí)際是調(diào)用libmali.so里的入口再由這個(gè)庫通過 ioctl 把命令提交給內(nèi)核驅(qū)動(dòng)。整個(gè)過程里“l(fā)inks”這個(gè)詞體現(xiàn)在兩個(gè)層面第一層是編譯和靜態(tài)鏈接。你的應(yīng)用要能解析到eglCreateContext、glBufferData這類符號(hào)。在 PC 上NVIDIA 幫你把 libGL.so 塞進(jìn)了系統(tǒng)目錄但 ARM 嵌入式環(huán)境往往要你手動(dòng)指-L和-l。這一層出錯(cuò)通常發(fā)生在 cmake 交叉編譯時(shí)找不到庫文件或者鏈接時(shí)出現(xiàn)“undefined reference to eglCreateContext”。第二層是運(yùn)行時(shí)動(dòng)態(tài)加載。當(dāng)你敲下./my_gpu_app后動(dòng)態(tài)鏈接器要能按編譯時(shí)記錄的 SONAME 找到libmali.so以及它的依賴。如果你的板子鏡像預(yù)裝的庫路徑不是標(biāo)準(zhǔn)/usr/lib或者你手動(dòng)把不同版本的 mali 庫扔到倉庫目錄就需要通過LD_LIBRARY_PATH或 ldconfig 告訴動(dòng)態(tài)鏈接器。這一層出錯(cuò)就是經(jīng)典的error while loading shared libraries: libmali.so: cannot open shared object file: No such file or directory。我自己的實(shí)踐里這兩層問題往往同時(shí)出現(xiàn)編譯鏈配好了運(yùn)行又掛。所以你在做平臺(tái)移植時(shí)不妨先停下來把整個(gè)鏈接過程拆開審視一遍不要一上來就去調(diào) shader。1.2 交叉編譯鏈選型為什么別一上來就去翻 ARM Compiler 5.06熱搜詞里反復(fù)出現(xiàn) “arm compiler 5.06u7 下載”“arm compiler 5”我想提醒一下ARM Compiler 5.06RVCT 風(fēng)格確實(shí)是老嵌入式項(xiàng)目里的老朋友很多裸機(jī) SoC SDK 和早期 Mali 驅(qū)動(dòng)包都是用它編譯的。但對(duì)于跑 Linux 的 Mali GPU 項(xiàng)目我建議你優(yōu)先用Linaro GCC而不是 ARM Compiler 5.06。原因是這幾點(diǎn)一linaro gcc 是開源的版本迭代快對(duì) C11/14 和 OpenMP 支持好而 ARMCC 5.x 早就停止功能更新了二Mali 用戶態(tài)驅(qū)動(dòng)廠商比如 Rockchip 的 BSP一般提供的是已經(jīng)針對(duì) GCC 編好的.so你用 ARMCC 編應(yīng)用運(yùn)行時(shí)是去調(diào) GCC 編的動(dòng)態(tài)庫ABI 層面雖然大體兼容都是 EABI但遇到 C 異常處理、STL 符號(hào)版本這類問題調(diào)試成本會(huì)非常高三也是最實(shí)際的ARM Compiler 5.06 在老機(jī)器上還得配許可證折騰 License 的時(shí)間夠你編譯十遍內(nèi)核了。只有一種情況我會(huì)考慮 ARM Compiler 5.06項(xiàng)目里同時(shí)要編裸機(jī)固件比如 Mali 相關(guān)的安全固件或獨(dú)立的 GPU 微控制器程序且 SDK 強(qiáng)制要求 RVCT。這種情境下你可以繞過系統(tǒng) GCC單獨(dú)用 ARMCC 編出獨(dú)立的裸機(jī)鏡像但在 Linux 應(yīng)用側(cè)還是老實(shí)用 GCC/Linaro 的交叉編譯鏈。所以我這里給出一個(gè)非常直接的建議交叉編譯工具鏈選aarch64-linux-gnu-gcc版本不低于 9如果你需要 OpenMP確認(rèn)工具鏈里包含libgomp。如果你用的是 Rockchip Linux SDK里面自帶的交叉編譯鏈就是 prebuilt 的 linaro gcc直接export PATH$PATH:/opt/your_sdk/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin即可。不要混用 kernel 編譯鏈和用戶態(tài)編譯鏈。Kernel module 和用戶態(tài)程序最好用同一套鏈避免 glibc 版本和符號(hào)版本差異帶來的問題。1.3 搞清楚你的 libmali 是哪種“馬甲”鏈接才不會(huì)錯(cuò)Mali 的“馬甲”多到讓人頭大同一個(gè) Rockchip BSP 里目錄下可能同時(shí)躺著libmali-midgard.so、libmali-bifrost.so、libmali-valhall.so或者帶-r32p0、-g2p0這類版本號(hào)尾巴的庫。我剛開始接觸時(shí)老是搞混以為隨便復(fù)制一個(gè)就行結(jié)果程序起來后 EGL 調(diào)用直接返回EGL_BAD_ALLOC。簡(jiǎn)單說Mali 驅(qū)動(dòng)跟 GPU 硬件代際強(qiáng)相關(guān)。你能在 SoC 數(shù)據(jù)手冊(cè)或內(nèi)核設(shè)備樹里看到 GPU 的型號(hào)比如 “Mali-T860”就是 Midgard 代對(duì)應(yīng)libmali-midgard.so“Mali-G52” 是 Bifrost 代對(duì)應(yīng)libmali-bifrost.soG78/G710 這類就是 Valhall 代。不同代際的 libmali 之間絕對(duì)不能混用。它們?cè)?EGL 擴(kuò)展、內(nèi)存分配、job slot 提交方式上差異非常大。鏈接中我的操作方法是先看設(shè)備樹或內(nèi)核日志確認(rèn) GPU 具體型號(hào)再在板子的/usr/lib/aarch64-linux-gnu/mali/或/usr/lib/arm-linux-gnueabihf/mali/里確認(rèn)有哪些庫文件然后用readelf -d libmali.so | grep SONAME查看它的 SONAME 到底是什么——這非常關(guān)鍵因?yàn)檫\(yùn)行時(shí)是按 SONAME 找?guī)斓娜绻愕?app 編譯時(shí)鏈接-lmali但 SONAME 卻是libmali.so.1編譯過了運(yùn)行卻會(huì)去找libmali.so.1而你系統(tǒng)里沒有這個(gè)文件名程序就起來不來。順帶一提像 Luckfox Pico、愛芯派這類小的 ARM 板Mali 的用戶態(tài)驅(qū)動(dòng)可能沒有原始廠商的版本更新快你有時(shí)需要從官方 BSP 的 release notes 里找對(duì)應(yīng)的“version string”而不是只看文件名。這個(gè)細(xì)節(jié)在我初期的項(xiàng)目里浪費(fèi)過好多時(shí)間。2. 編譯鏈接實(shí)操CMake 交叉編譯項(xiàng)目里Mali GPU 鏈接的五步配置2.1 首先讓 CMake 認(rèn)識(shí)你的 ARM 工具鏈寫 Mali 項(xiàng)目的人基本繞不開 CMake因?yàn)樗鼘?duì)交叉編譯的支持做得相當(dāng)順手。你可以先建一個(gè)arm-linux-toolchain.cmake核心內(nèi)容如下set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(TOOLCHAIN_PREFIX aarch64-linux-gnu-) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g) set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)這里最容易被忽略的是CMAKE_FIND_ROOT_PATH。它告訴 CMake找?guī)旌皖^文件時(shí)只在/usr/aarch64-linux-gnu下找不要跑去 x86 宿主機(jī)的/usr/lib。如果你不設(shè)置這個(gè)CMake 可能會(huì)在宿主機(jī)上找 libGL、libEGL鏈接出一堆 x86 格式的庫放板子上直接段錯(cuò)誤。我早期就犯過這個(gè)錯(cuò)連 vc4 simulator 的庫都差點(diǎn)被拉進(jìn)來。CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER的意思是找可執(zhí)行程序比如 pkg-config時(shí)仍用宿主機(jī)的因?yàn)槟鞘?x86 可執(zhí)行的工具用來生成編譯參數(shù)但庫和頭文件只能從目標(biāo)系統(tǒng)目錄里找。2.2 手把手配置 EGL/GLES 頭文件和庫路徑假設(shè)你拿到了 Rockchip 提供的libmali頭文件一般在/usr/include/EGL、/usr/include/GLES2、/usr/include/GLES3這幾個(gè)目錄下。在 CMakeLists 里這么寫set(MALI_INCLUDE_DIR /usr/aarch64-linux-gnu/include) set(MALI_LIB_DIR /usr/aarch64-linux-gnu/lib) include_directories( ${MALI_INCLUDE_DIR} ${MALI_INCLUDE_DIR}/EGL ${MALI_INCLUDE_DIR}/GLES2 ${MALI_INCLUDE_DIR}/GLES3 ) link_directories(${MALI_LIB_DIR})然后添加可執(zhí)行文件并鏈接add_executable(mali_demo main.cpp) target_link_libraries(mali_demo mali # 對(duì)應(yīng) libmali.so EGL GLESv2 pthread dl m )我習(xí)慣把libmali.so通過-l:libmali.so這種形式來鏈接防止名字匹配錯(cuò)。你在 target_link_libraries 里寫mali鏈接器會(huì)找libmali.so或libmali.a如果這個(gè)庫 SONAME 不匹配鏈接也能成功但運(yùn)行時(shí)就有問題。為保險(xiǎn)推薦直接寫全路徑target_link_libraries(mali_demo ${MALI_LIB_DIR}/libmali-bifrost-g52.so EGL GLESv2 pthread dl m )這樣寫還有個(gè)好處你一眼就能告訴自己板上跑的是 Bifrost G52 的 mali 庫而不是 Midgard 的。項(xiàng)目維護(hù)起來幾個(gè)月后回看 CMakeLists 都能想起當(dāng)時(shí)的硬件平臺(tái)。2.3 鏈接選項(xiàng)里必須注意的“隱藏符號(hào)”問題Mali 的 libmali.so 是個(gè)“大雜燴”有些版本會(huì)同時(shí)導(dǎo)出 EGL、GLESv1、GLESv2、OpenVG 的符號(hào)。如果你在鏈接時(shí)用了--as-needed并且鏈接順序不對(duì)鏈接器可能把libmali.so整個(gè)丟棄導(dǎo)致最后可執(zhí)行文件里沒有任何 EGL 符號(hào)。運(yùn)行時(shí)就會(huì)報(bào)undefined symbol: eglGetDisplay。我通常在 CMake 的 CMAKE_EXE_LINKER_FLAGS 里加入以下內(nèi)容set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-as-needed)這樣強(qiáng)制所有顯式列出的庫都參與鏈接。在 Ubuntu/Debian 系的交叉編譯環(huán)境里尤其要注意這一點(diǎn)因?yàn)橄到y(tǒng) GCC 默認(rèn)的--as-needed行為會(huì)比你在 x86 電腦上遇到的問題更隱蔽程序編譯通過、卻半天跑不起來。如果你是手工寫gcc命令而不是用 CMake那我給你一個(gè)標(biāo)準(zhǔn)命令行模板aarch64-linux-gnu-g main.cpp -o mali_demo \ -I/usr/aarch64-linux-gnu/include \ -L/usr/aarch64-linux-gnu/lib \ -l:libmali-bifrost-g52.so -lEGL -lGLESv2 -lpthread -ldl -lm \ -Wl,--no-as-needed執(zhí)行完以后用aarch64-linux-gnu-readelf -d mali_demo | grep NEEDED檢查一下看看 NEEDED 列表里的庫名是不是預(yù)期的名稱——這一步真的很快能省去后面大量調(diào)試時(shí)間。2.4 JIT shader 編譯與特定工具鏈約束Mali GPU 驅(qū)動(dòng)有“JIT 編譯”機(jī)制shader 編譯發(fā)生在運(yùn)行時(shí)而不是預(yù)先編譯雖然也有 offline blob 的方式比如malisc但多數(shù)項(xiàng)目還是運(yùn)行時(shí)編譯。這意味著你的進(jìn)程在運(yùn)行時(shí)要能夠分配可執(zhí)行內(nèi)存頁所以我們通常要鏈接dl并且確保/dev/mali設(shè)備節(jié)點(diǎn)的權(quán)限允許當(dāng)前用戶訪問。另外如果你的程序用到了 OpenGL ES 3.1 的計(jì)算著色器compute shader記得要在編譯時(shí)加-stdc11以上并且確保你鏈接的 libmali 支持這個(gè)擴(kuò)展版本。有些老版本 BSP 里的 libmali 只到 GLES3.0運(yùn)行時(shí)會(huì)返回GL_INVALID_OPERATION或干脆造成 GPU 崩潰gpu crash dump triggered。如果你是從桌面 OpenGL 轉(zhuǎn)到 Mali心里要有個(gè)預(yù)期Mali 對(duì) GL 版本的支撐就是“能用但別挑戰(zhàn)極限”你最好把目標(biāo)定為 GLES3.1 或 GLES3.2而不是去想 4.x core profile。這樣鏈接和運(yùn)行時(shí)的問題都會(huì)少一大截。2.5 靜態(tài)鏈接還是動(dòng)態(tài)鏈接別迷信“靜態(tài)更省事”有些朋友為了部署省事把 libmali 直接靜態(tài)鏈接進(jìn)主程序。我不建議這么做原因是一Mali 庫包含對(duì)內(nèi)核接口的依賴內(nèi)核驅(qū)動(dòng)版本升級(jí)后舊靜態(tài)庫可能和新內(nèi)核不兼容而你沒法通過替換一個(gè).so來解決二Mali 生態(tài)里很多輔助庫比如 OpenCL 的libOpenCL.so本來就不是純靜態(tài)發(fā)布的三如果你的 SDK 里有多個(gè) GPU 相關(guān)程序動(dòng)態(tài)鏈接可以共享一份用戶態(tài)驅(qū)動(dòng)內(nèi)存對(duì)整個(gè)系統(tǒng)資源占用更友好。所以我推薦的策略是動(dòng)態(tài)鏈接 在部署腳本里顯式復(fù)制庫 為依賴設(shè)置 RPATH。當(dāng)然有些 BSP 的 libmali 是用某些舊 GCC 版本編的動(dòng)態(tài)加載時(shí)可能會(huì)報(bào)缺少 GLIBC 某個(gè)版本符號(hào)。這時(shí)候如果你不想重新編譯頂層依賴就得在板子上用符號(hào)鏈接偽造一個(gè) GLIBC 版本但這非常危險(xiǎn)不如檢查自己的工具鏈版本和板子 stub 庫的一致性。3. 運(yùn)行時(shí)動(dòng)態(tài)庫加載LD_LIBRARY_PATH 與 ldconfig 的決策細(xì)節(jié)3.1 那行“export LD_LIBRARY_PATH...”命令到底在干嘛你搜到的熱詞里有一個(gè)典型的命令export LD_LIBRARY_PATH/usr/lib/aarch64-linux-gnu/mali:$LD_LIBRARY_PATH這行命令的核心作用是在動(dòng)態(tài)鏈接器的搜索路徑優(yōu)先級(jí)里把/usr/lib/aarch64-linux-gnu/mali放到繼承的路徑之前。動(dòng)態(tài)鏈接器通常是ld-linux-aarch64.so.1加載程序時(shí)會(huì)按以下順序查找共享庫DT_RPATH如果存在且 DT_RUNPATH 未設(shè)置LD_LIBRARY_PATH 環(huán)境變量可執(zhí)行文件的 DT_RUNPATH緩存文件/etc/ld.so.cache默認(rèn)目錄/lib、/usr/lib等如果你板子上/usr/lib/aarch64-linux-gnu/里本身也有一個(gè)libEGL.so而 mali 目錄里有另一個(gè)那么加了LD_LIBRARY_PATH后E GL 調(diào)用就會(huì)優(yōu)先命中 Mali 目錄下的版本。這在 Rockchip 和全志的許多 Debian 鏡像里非常關(guān)鍵因?yàn)樗鼈兿到y(tǒng)自帶的libEGL.so可能指向 panfrost 或 llvmpipe軟件渲染唯獨(dú) mali 目錄里的才是硬件 GPU 驅(qū)動(dòng)。我用個(gè)生活類比LD_LIBRARY_PATH就像給外賣配送員提前畫了一條“優(yōu)先送達(dá)路線”只要這條路線上的商家?guī)齑嬖谒筒粫?huì)繞遠(yuǎn)路去系統(tǒng)默認(rèn)市場(chǎng)取貨。但如果那條路線上的商家還沒開業(yè)文件不存在或權(quán)限不對(duì)外賣小哥還是會(huì)退回默認(rèn)路線而這一“退回”行為程序往往不會(huì)給你明確提示。3.2 驗(yàn)證你的 .so 實(shí)際被哪個(gè)路徑加載如果你懷疑程序加載了錯(cuò)誤的庫版本最實(shí)際的驗(yàn)證方式有兩個(gè)。第一個(gè)用ldd檢查動(dòng)態(tài)庫依賴。注意交叉編譯環(huán)境下的 ldd 不能直接跑目標(biāo)板程序但你可以用aarch64-linux-gnu-readelf -d來看也可以把程序拷貝到板子上在板子上跑ldd。板子的命令rootboard:~# ldd ./mali_demo linux-vdso.so.1 (0x0000ffff8f7f0000) libmali-bifrost-g52.so /usr/lib/aarch64-linux-gnu/mali/libmali-bifrost-g52.so (0x0000ffff8f5f0000) libEGL.so.1 /usr/lib/aarch64-linux-gnu/mali/libEGL.so.1 (0x0000ffff8f5e0000) libGLESv2.so.2 /usr/lib/aarch64-linux-gnu/mali/libGLESv2.so.2 (0x0000ffff8f5d0000) libpthread.so.0 /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffff8f5b0000) libdl.so.2 /lib/aarch64-linux-gnu/libdl.so.2 (0x0000ffff8f5a0000) ...如果這里顯示的是/usr/lib/aarch64-linux-gnu/libGLESv2.so.2而不是 mali 目錄說明 LD_LIBRARY_PATH 沒配置成功或者該路徑下沒有對(duì)應(yīng)文件。第二個(gè)是在程序里打印實(shí)際加載路徑。用dladdr或直接打印dlopen句柄的路徑這在調(diào)試時(shí)特別有用。我在一個(gè)合成器項(xiàng)目里加過如下代碼#include dlfcn.h #include cstdio int main() { void* handle dlopen(libEGL.so.1, RTLD_NOW); if (!handle) { fprintf(stderr, dlopen failed: %s\n, dlerror()); return 1; } Dl_info info; if (dladdr(dlsym(handle, eglGetDisplay), info)) { printf(EGL implementation: %s\n, info.dli_fname); } dlclose(handle); return 0; }實(shí)測(cè)下來這個(gè)方法比看 ldd 輸出更直接因?yàn)橛械膸焓峭ㄟ^ dlopen 動(dòng)態(tài)打開而不是直接編譯鏈接的在 ldd 里根本看不到。3.3 更持久的配置/etc/ld.so.conf.d/mali.confLD_LIBRARY_PATH是臨時(shí)的、只對(duì)當(dāng)前 shell 進(jìn)程樹有效的方案。如果你希望程序開機(jī)就能用或者通過 systemd 服務(wù)啟動(dòng)的程序也能自動(dòng)找到 Mali 庫我更推薦在板子上創(chuàng)建一個(gè)配置echo /usr/lib/aarch64-linux-gnu/mali /etc/ld.so.conf.d/mali.conf ldconfig這樣動(dòng)態(tài)鏈接器在讀取/etc/ld.so.cache時(shí)就會(huì)把 mali 目錄下的庫都索引好后續(xù)任何程序直接libEGL.so.1都能命中。這個(gè)做法的核心好處是“全局生效”缺點(diǎn)是如果你板子上同時(shí)存在多個(gè) GPU 用戶態(tài)庫比如 mali 和 panfrostldconfig的索引順序可能不按你的預(yù)期來。這時(shí)候你可以用ldconfig -p | grep mali查看緩存列表確認(rèn)優(yōu)先級(jí)。如果發(fā)現(xiàn) panfrost 搶了先可以用/etc/ld.so.preload但一般不建議或者把不需要的庫重命名/移出目錄來確保命中目標(biāo)庫。我在 RK3588 的板子上就遇到過類似問題系統(tǒng)自帶的 gdm/wayland 合成器需要 Mali 庫但它以 systemd user 服務(wù)方式運(yùn)行LD_LIBRARY_PATH不會(huì)傳入該用戶的登錄 shell。后來我用ld.so.conf.d方案一次性解決穩(wěn)定跑了幾個(gè)月。3.4 RPATH 別亂設(shè)但也不能完全不設(shè)編譯時(shí)設(shè)置 RPATH可以在可執(zhí)行文件內(nèi)部記錄庫搜索路徑效果類似aarch64-linux-gnu-g main.cpp -o mali_demo \ -Wl,-rpath,/usr/lib/aarch64-linux-gnu/mali \ -L/usr/lib/aarch64-linux-gnu/mali -l:libmali-bifrost-g52.soRPATH 的坑在于如果目錄里缺失某個(gè)運(yùn)行時(shí)依賴程序報(bào)錯(cuò)信息會(huì)很隱晦且當(dāng)你把整個(gè)目錄結(jié)構(gòu)移動(dòng)到另一臺(tái)機(jī)器上時(shí)RPATH 里寫死的絕對(duì)路徑會(huì)導(dǎo)致庫找不到。更推薦用$ORIGIN風(fēng)格-Wl,-rpath,$ORIGIN/libs這表示可執(zhí)行文件同目錄下的libs子目錄。把 libmali 系列庫復(fù)制到應(yīng)用的libs目錄整個(gè)程序就是“自包含”的很適合嵌入式應(yīng)用發(fā)布。需要注意的是動(dòng)態(tài)鏈接器只有在可執(zhí)行文件設(shè)置了 DT_RUNPATH 而不是 DT_RPATH 時(shí)才會(huì)讓LD_LIBRARY_PATH優(yōu)先于 RPATH如果你想要 RPATH 最高優(yōu)先級(jí)甚至高于 LD_LIBRARY_PATH必須使用 DT_RPATH 格式但大多數(shù)現(xiàn)代系統(tǒng)默認(rèn)會(huì)轉(zhuǎn)成 DT_RUNPATH。這塊兒細(xì)節(jié)很多我的建議是能用LD_LIBRARY_PATH或ld.so.conf.d解決的就別折騰 RPATH只有在需要“單目錄分發(fā)”時(shí)才用$ORIGIN。4. 交叉編譯中的典型問題與排查技巧4.1 程序咔一下退出了還報(bào) gpu crash dump triggeredMali 驅(qū)動(dòng)的日志里出現(xiàn)gpu crash dump triggered是最讓人頭大的錯(cuò)誤之一。我在一個(gè) RK3399 平臺(tái)上跑自己寫的延遲渲染 demo 時(shí)切換 framebuffer 分辨率后必現(xiàn)崩潰。經(jīng)過抓取/sys/kernel/debug/mali的 dump 才發(fā)現(xiàn)問題出在我在程序里用glBufferData頻繁分配了一個(gè)超大 vertex buffer而庫版本沒有開啟 GPU 內(nèi)存的 CMA 預(yù)分配導(dǎo)致物理內(nèi)存碎片化驅(qū)動(dòng)無法分配連續(xù) pages最終 GPU job 超時(shí)崩潰。這個(gè)問題的排查方向我建議從這三個(gè)點(diǎn)入手用戶的 app 是否用到了 Mali 不擅長(zhǎng)的“長(zhǎng)渲染指令”或“非常規(guī) framebuffer 維度”。系統(tǒng)內(nèi)存是否不足。Mali 和 CPU 共用內(nèi)存GPU 內(nèi)存分配失敗不比 CPU OOM 溫和。內(nèi)核驅(qū)動(dòng)和用戶態(tài) libmali 版本是否一致。版本不匹配是這類崩潰的頭號(hào)原因。調(diào)試時(shí)建議先在內(nèi)核啟動(dòng)參數(shù)里加上mali_debug_force_panic或打開/sys/kernel/debug/mali的 debug 節(jié)點(diǎn)讓它輸出更詳細(xì)的 job 狀態(tài)。工業(yè)級(jí)做法是寫一個(gè)長(zhǎng)時(shí)間運(yùn)行的 stress 腳本不斷地創(chuàng)建銷毀 EGL Context同時(shí)用dmesg監(jiān)控mali內(nèi)核日志一旦崩了就把完整調(diào)用鏈抓出來。我后來定位到崩潰的根因是我在 GLES 主線程里同時(shí)跑了一個(gè) CPU 線程讀回glReadPixels而 Mali 的同步對(duì)象處理在這種情況下有比較高的開銷導(dǎo)致 CPU 線程頻繁觸發(fā) job slot 搶占。為了解決它我在隊(duì)列提交前用了glFinish()而非glFlush()并把讀寫分離到不同 FBO。問題隨之消失。4.2 為什么我鏈接了 libmali還是報(bào) undefined reference to eglCreateContext這問題通常不是你沒鏈接而是頭文件和庫不配套。舉例頭文件來自 Mesa 的主機(jī)開發(fā)包里面聲明了 EGL 1.5 的所有函數(shù)而你板子上的 libmali 可能只實(shí)現(xiàn)了 EGL 1.4。鏈接時(shí)的 undefined reference 倒不一定出現(xiàn)更常見的是運(yùn)行時(shí)報(bào)EGL_BAD_DISPLAY或EGL_BAD_ALLOC。如果你看到的真的是鏈接錯(cuò)誤為undefined reference to eglCreateContext則一般有下面幾種情況你鏈接的庫文件名不對(duì)。-lEGL實(shí)際去找libEGL.so但板子 BSP 里只有l(wèi)ibmali-bifrost-g52.so里面雖然導(dǎo)出 EGL 符號(hào)但并沒有名為libEGL.so的軟鏈接。解決辦法在 mali 庫目錄里手動(dòng)建libEGL.so - libmali-bifrost-g52.so、libGLESv2.so - libmali-bifrost-g52.so。你忘了在鏈接命令里加-lEGL。因?yàn)?EGL 頭文件是純聲明編譯器不會(huì)知道你還需要專門鏈接哪個(gè)庫它只會(huì)看著源碼里調(diào)用了eglCreateContext等到鏈接器階段才告訴你找不到符號(hào)。你的 toolchain 是arm-linux-gnueabihf但目標(biāo)系統(tǒng)是aarch64。位數(shù)不一致鏈接器當(dāng)然報(bào) undefined。排查時(shí)要用file libmali*.so看 ELF 的 machine 類型。實(shí)際操作中我最常用的土辦法是先編譯一個(gè)只調(diào)用eglGetDisplay的最小程序把庫路徑和-Wl,--trace或-Wl,-y,eglCreateContext加進(jìn)去鏈接器會(huì)輸出它到底在哪個(gè)庫里找到符號(hào)。這條命令的輸出信息量極大能幫你快速判斷是頭文件和庫版本不匹配還是庫文件本身有問題。4.3 重啟后 LD_LIBRARY_PATH 丟失如果你是在 SSH 會(huì)話里執(zhí)行export LD_LIBRARY_PATH...一關(guān)終端就失效這是 shell 環(huán)境變量作用域的問題。針對(duì)這種情況我建議根據(jù)啟動(dòng)方式選擇方案手動(dòng)調(diào)試寫到~/.bashrc或/etc/profile.d/mali.sh。systemd 服務(wù)在 service 文件的[Service]段加EnvironmentLD_LIBRARY_PATH/usr/lib/aarch64-linux-gnu/mali。圖形桌面登錄寫到 Xsession 或 wayland-session 的配置里。最省事也最穩(wěn)定直接用/etc/ld.so.conf.d/mali.confldconfig。我見過不少朋友把LD_LIBRARY_PATH寫進(jìn).bashrc結(jié)果 systemd 起的服務(wù)依然找不到庫。后來我全部統(tǒng)一成ld.so.conf.d方案系統(tǒng)所有進(jìn)程都受益。唯一需要注意的是ldconfig后要確認(rèn)ldconfig -p里出現(xiàn)了 mali 庫并注意順序優(yōu)先級(jí)。4.4 一個(gè)萬能級(jí)的排查步驟清單如果你現(xiàn)在編譯一個(gè) Mali GPU 程序遇到問題按下面順序走一遍通常 20 分鐘內(nèi)能定位確認(rèn) GPU 型號(hào)cat /sys/class/misc/mali/device/uevent或內(nèi)核日志里的maliprobe 信息。確認(rèn)用戶態(tài)庫是否存在ls -l /usr/lib/aarch64-linux-gnu/mali/。查看庫的 SONAMEreadelf -d libmali-bifrost-g52.so | grep SONAME。交叉編譯后用readelf -d app | grep NEEDED確認(rèn)依賴。拷貝到板子上用ldd app看能否解析。用LD_DEBUGlibs ./app看動(dòng)態(tài)鏈接器的詳細(xì)查找路徑這招非常有用。運(yùn)行最小 EGL 示例而不是直接上復(fù)雜渲染器。我把常遇到的靜態(tài)問題和應(yīng)對(duì)方法整理成一張速查表方便你貼到工位旁邊癥狀大概率原因排查/解決動(dòng)作編譯時(shí)找不到 EGL/GLES 頭文件INCLUDE 路徑未指向 BSP 的 include 目錄在 CMake 里打印 include dirs確認(rèn)路徑存在且包含 EGL/egl.h鏈接時(shí) undefined reference頭文件與庫不匹配庫名寫錯(cuò)檢查-lEGL是否實(shí)際解析到有符號(hào)的.so用nm -D libmali.so | grep eglCreateContext運(yùn)行時(shí)找不到 libmaliLD_LIBRARY_PATH 未設(shè)置或目錄沒有這個(gè)庫用export LD_LIBRARY_PATH/usr/lib/aarch64-linux-gnu/mali或 ld.so.conf.d運(yùn)行時(shí)加載到錯(cuò)誤的 libEGL庫里有多套實(shí)現(xiàn)用ldd確認(rèn)實(shí)際加載路徑必要時(shí)移動(dòng)/屏蔽舊庫程序崩潰且內(nèi)核打 mali crash dump內(nèi)核驅(qū)動(dòng)與用戶態(tài)庫版本不匹配/內(nèi)存壓力統(tǒng)一 BSP 版本調(diào)整 GPU 內(nèi)存分配策略檢查 dmesg渲染結(jié)果花屏/黑屏顏色格式、buffer 尺寸不對(duì)檢查 EGL config 的 buffer size嘗試不同的 ANativeWindow format5. 再進(jìn)一步GPU 計(jì)算與 AI 部署場(chǎng)景下的 Mali 鏈接經(jīng)驗(yàn)現(xiàn)在在 ARM 板上做 GPU 計(jì)算和 AI 推理的場(chǎng)景非常普遍像paddleocr、sensevoice部署到 ARM 架構(gòu)平臺(tái)時(shí)很多人誤以為只靠 CPU 就能跑或者以為大家都去 CUDA 了Mali 就不需要了。實(shí)際上Mali 也支持 OpenCL部分產(chǎn)品還支持 OpenGL ES 3.1 的 compute shader甚至 ARM 在最新的 Valhall 代 GPU 上強(qiáng)化了矩陣運(yùn)算能力。對(duì)于在 ARM Mali 上部署 AI 模型鏈接層面的經(jīng)驗(yàn)也值得單獨(dú)拎出來說一說。5.1 OpenCL 的鏈接和 libmali 的“萬能導(dǎo)出”Mali GPU 要跑 OpenCL往往同樣依賴一個(gè) libmali 或?qū)iT的 libOpenCL.so。在 Rockchip 的 BSP 里你經(jīng)常會(huì)看到/usr/lib/aarch64-linux-gnu/mali/libOpenCL.so。這個(gè)庫可能只是一個(gè)符號(hào)鏈接到 libmali-bifrost.so。如果你的應(yīng)用要鏈接 OpenCL公式如下aarch64-linux-gnu-g cl_demo.cpp -o cl_demo \ -I/usr/aarch64-linux-gnu/include/CL \ -L/usr/lib/aarch64-linux-gnu/mali \ -lOpenCL -lpthread -ldl這里要注意有些 OpenCL 頭文件版本要求庫至少支持 OpenCL 1.2而部分老 Mali 的 BSP 只提供 1.1 擴(kuò)展。我建議你在編譯前先寫個(gè)clinfo類似的工具在板子上跑一下確認(rèn)CL_PLATFORM_VERSION和CL_DEVICE_TYPE_GPU。從部署角度如果你跑 PaddleOCR 的 GPU 版Paddle Lite 加載的 mali OpenCL 庫需要在編譯 Paddle Inference 時(shí)指定-DWITH_GPUON -DWITH_OPENCLON并且靜態(tài)/動(dòng)態(tài)搜索 libOpenCL.so 的路徑要提前配置好。很多人以為 PaddleOCR 的 GPU 部署只要換一個(gè)模型文件就行實(shí)際上鏈接和運(yùn)行時(shí)庫配置缺一不可。我在 RK3588 上部署 PaddleOCR 時(shí)就是靠把libOpenCL.so放進(jìn)/usr/lib/aarch64-linux-gnu/mali/再寫一個(gè)mali.conf然后用LD_LIBRARY_PATH指向它應(yīng)用才正確調(diào)起 GPU。5.2 SenseVoice 等新一代小模型的 ARM 部署要考慮 GPU 動(dòng)態(tài)庫沖突像sensevoice-small這類 ASR 模型官方往往提供 ARM 架構(gòu) CPU 版本但我實(shí)測(cè)過如果在帶 Mali GPU 的板子上有 libOpenCL部分推理框架會(huì)默認(rèn)嘗試 GPU/OpenCL 加速這時(shí)如果鏈接庫配置不對(duì)運(yùn)行可能掛掉。我的處理方式是如果只是做 CPU 推理驗(yàn)證就在啟動(dòng)腳本里明確不加載 mali 的 OpenCL 庫如果想要 GPU 加速就專門設(shè)計(jì)一條推理路徑確保libOpenCL.so和libmali.so來自同一 BSP 版本并設(shè)置好 loader 搜索順序。這里最容易踩的坑是你自己把libOpenCL.so.1放到/usr/local/lib而系統(tǒng)也有/usr/lib/aarch64-linux-gnu/libOpenCL.so.1兩邊的實(shí)現(xiàn)不同導(dǎo)致 clGetPlatformIDs 返回空。我建議你對(duì)板子上所有 OpenCL 相關(guān)庫做一次“審計(jì)”find / -name *OpenCL* -type f -o -name *libmali* -type f 2/dev/null把路徑理清后再?zèng)Q定是統(tǒng)一通過ld.so.conf.d配置還是在每個(gè)服務(wù)的啟動(dòng)腳本里手動(dòng) export。小模型部署項(xiàng)目里穩(wěn)定大于性能。5.3 多 GPU 同時(shí)測(cè)試與 GPU 調(diào)度Mali 不是主戰(zhàn)場(chǎng)但也別忽略現(xiàn)在的 AI 服務(wù)器場(chǎng)景里linux 三個(gè)gpu同時(shí)測(cè)試、gpu調(diào)度這類詞很熱但那是 NVIDIA 和昇騰的主場(chǎng)。你要是真在 ARM 單板上做“多 GPU 調(diào)度”通常是指 GPU NPU VPU 的異構(gòu)協(xié)同。鏈接層面的經(jīng)驗(yàn)是NPU 工具鏈比如 RKNN和 GPU 工具鏈libmali會(huì)同時(shí)出現(xiàn)在系統(tǒng)里它們各自有自己的 runtime 庫容易因符號(hào)沖突打架。我在 RK3568 上做過一個(gè)路燈檢測(cè)項(xiàng)目RKNN Toolkit 的庫依賴librga.so而這個(gè)庫又依賴libmali.so做 2D 加速。如果不把libmali路徑正確配置RGA 初始化也會(huì)失敗。雖然這不是嚴(yán)格的“多 GPU 調(diào)度”但底層都繞不開 Mali library 的鏈接是否干凈。我當(dāng)時(shí)的做法是把 RKNN 和 RGA 的庫、Mali 庫全部放入/opt/vendor/libs然后為每個(gè)服務(wù)單獨(dú)配置LD_LIBRARY_PATH避免全局污染。5.4 NVIDIA GPU Operator 文檔、arm64 GPU 節(jié)點(diǎn)Mali 只是背景板還有一個(gè)容易誤解的地方nvidia gpu operator 官方文檔 中文這種熱詞你可能會(huì)覺得與 Mali 無關(guān)但如果你的 ARM 平臺(tái)指的是Grace-Hopper 這類 NVIDIA ARM64 服務(wù)器那么它里面并沒有 Mali GPU而是 NVIDIA 自家 GPU。這種平臺(tái)上的 GPU 驅(qū)動(dòng)、容器運(yùn)行時(shí)支持跟 Mali 完全不是一套。寫這篇博文的目的之一也是想提醒大家看到 “ARM” 和 “GPU” 兩個(gè)詞不要想當(dāng)然認(rèn)為就是 Mali。ARM 作為一種 CPU 架構(gòu)可以搭配 Mali、Adreno、PowerVR、NVIDIA 等不同的 GPU IP而“Mali GPU links”更準(zhǔn)確地說是針對(duì) ARM SoC 集成的 Mali 圖形/計(jì)算處理單元的鏈接與部署場(chǎng)景。如果你要在 NVIDIA ARM64 上部署加速需要考慮的是 NVIDIA 官方 driver 的 deb/rpm 包【像熱詞里的銀河麒麟 ssh 10.3 rpm升級(jí)包arm就屬于這種場(chǎng)景】而不是 Mali 的 libmali。這個(gè)區(qū)別我在多個(gè)項(xiàng)目里反復(fù)提醒過因?yàn)閮烧呔幾g參數(shù)、動(dòng)態(tài)庫名稱、EGL 實(shí)現(xiàn)都完全不同。6. 避坑心得與長(zhǎng)期維護(hù)建議6.1 我每次搭建 Mali 開發(fā)環(huán)境都會(huì)做的三件小事經(jīng)過反復(fù)折騰后我把一套“初始化清單”固定了下來你以后拿到任何新的 ARM/Mali 板子都可以照做第一下載或提取 BSP 后先別急著編應(yīng)用先把板子上的 GPU 相關(guān)庫做一次快照ls -l /usr/lib/aarch64-linux-gnu/mali/、cat /sys/kernel/debug/mali/version或/sys/class/misc/mali/device/uevent把版本號(hào)記錄下來。第二在板子上跑一個(gè)最小的 EGL 初始化程序。這個(gè)程序不做任何渲染只是創(chuàng)建 EGLDisplay、EGLContext打印EGL_VENDOR。如果它能過說明庫和系統(tǒng)環(huán)境正常如果不行后面搞什么大程序都是白搭。第三寫一個(gè)setenv_mali.sh腳本內(nèi)容就是用export LD_LIBRARY_PATH/usr/lib/aarch64-linux-gnu/mali:$LD_LIBRARY_PATH并且用ldconfig -p驗(yàn)證它的實(shí)際生效情況。如果你的系統(tǒng)已經(jīng)用ld.so.conf.d方案則這個(gè)腳本可以空著但你要確保每個(gè) systemd 服務(wù)的Environment字段都對(duì)了。6.2 如何確保內(nèi)核驅(qū)動(dòng)和用戶態(tài)庫版本的一致Mali 最麻煩的問題就是內(nèi)核 kbase 驅(qū)動(dòng)和用戶態(tài) libmali 的版本必須匹配。比如 RK 的 BSP release 里內(nèi)核側(cè)通過mali_kbase模塊實(shí)現(xiàn)用戶態(tài)側(cè)libmali的版本字符串通常長(zhǎng)這樣r32p0-01rel0或g2p0-01rel0。如果你的內(nèi)核 driver 是 r32p0而用戶態(tài)庫是 g2p0即使兩者都能加載運(yùn)行一段時(shí)間后也極易產(chǎn)生 GPU crash dump。我建議你在初始化時(shí)寫一個(gè)監(jiān)控腳本定時(shí)抓 dmesg 里的maliregister 信息再對(duì)照庫的strings libmali.so | grep r[0-9]p輸出確認(rèn)一致。這聽起來很土但在嵌入式環(huán)境里往往比想象中有效。你甚至可以寫個(gè)小函數(shù)把查詢結(jié)果自動(dòng)拼接成一條日志放到 CI 流水線里每次更新 BSP 后自動(dòng)比對(duì)。選擇 BSP 時(shí)盡量使用官方 release 里配好的固定版本組合不要自己去內(nèi)核主線里隨便升級(jí) kbase 驅(qū)動(dòng)——主線內(nèi)核的 Mali 驅(qū)動(dòng)版本往往和 Rockchip/全志的庫版本不匹配。6.3 最終部署分發(fā)應(yīng)用時(shí)把庫和環(huán)境一起帶上我經(jīng)常看到有人把編譯好的二進(jìn)制直接拷給同事然后同事跑不起來原因就是目標(biāo)板子缺少 Mali 庫路徑。為了避免這種低級(jí)問題我現(xiàn)在一律在發(fā)布目錄里帶上一個(gè)deploy/文件夾my_app/ ├── my_app # 主程序 ├── libs/ │ ├── libmali-bifrost-g52.so │ ├── libEGL.so - libmali-bifrost-g52.so │ ├── libGLESv2.so - libmali-bifrost-g52.so │ ├── libOpenCL.so - libmali-bifrost-g52.so │ └── libgbm.so.1 # 如果有 GBM 需求 ├── run.sh └── README.mdrun.sh內(nèi)容非常短#!/bin/bash SCRIPT_DIR$(cd $(dirname $0) pwd) export LD_LIBRARY_PATH$SCRIPT_DIR/libs:$LD_LIBRARY_PATH exec $SCRIPT_DIR/my_app $這種方式既保證了庫版本的可控又避免了污染系統(tǒng)目錄后續(xù)升級(jí)應(yīng)用時(shí)只需替換libs下的.so完全不用改動(dòng)系統(tǒng)鏡像。我做過的好幾個(gè)嵌入式 HMI 項(xiàng)目都是這么發(fā)版的。當(dāng)然如果板子上的系統(tǒng)集成商有統(tǒng)一鏡像管理你仍可以沿用/usr/lib/aarch64-linux-gnu/malild.so.conf.d方案但應(yīng)用自攜帶libs至少是一種與環(huán)境解耦的底牌。6.4 關(guān)于LD_LIBRARY_PATH的一個(gè)容易被忽略的細(xì)節(jié)最后補(bǔ)充一個(gè)在這個(gè)問題上極其容易被忽略的坑動(dòng)態(tài)鏈接器對(duì)LD_LIBRARY_PATH的搜索順序是啟動(dòng)時(shí)固化的不是運(yùn)行中動(dòng)態(tài)變更的。也就是說如果你的程序在運(yùn)行過程中把庫路徑unset或改成別的值已經(jīng)加載進(jìn)來的庫不會(huì)受影響。所以如果你在調(diào)試時(shí)看到“我明明改了環(huán)境變量但程序還是報(bào)錯(cuò)”大概率是因?yàn)槟愕?shell 環(huán)境沒有重新執(zhí)行export或者程序的父進(jìn)程是 systemd 啟動(dòng)的根本不會(huì)繼承你 shell 里的變量。解決方法是始終用env | grep LD_LIBRARY_PATH確認(rèn)當(dāng)前值或者在程序里主動(dòng)調(diào)用dlopen并指定絕對(duì)路徑。有些程序例如部分 AI 推理引擎內(nèi)部自己管理庫加載可能不走系統(tǒng)動(dòng)態(tài)鏈接器的默認(rèn)搜索而是通過/proc/self/maps和dlopen的絕對(duì)路徑來加載。這種情況下你即便配好LD_LIBRARY_PATH也不一定管用最直接的辦法就是看到庫路徑不對(duì)時(shí)手動(dòng)改庫的軟鏈接或直接替換/usr/lib下的庫文件但這種操作要盡量保證系統(tǒng)里沒有其他程序依賴舊版本。我在 RK3588 上面調(diào)試 GStreamer Mali 的 GPU 視頻合成時(shí)就遇到過 GStreamer 用絕對(duì)路徑加載libmali而忽略LD_LIBRARY_PATH的情況最后是通過patchelf --set-rpath /usr/lib/aarch64-linux-gnu/mali給 GStreamer 的插件 .so 設(shè)置 RPATH 解決的。這里不展開講 patchelf 的所有參數(shù)但記住一個(gè)原則軟件加載庫的路徑可能五花八門最終要確認(rèn)的是 /proc/進(jìn)程pid/maps 里面那行 .so 到底指向哪里。6.5 額外提醒交叉編譯時(shí)不要過度依賴-marchnative我知道很多人喜歡在交叉編譯時(shí)加-marchnative來提升性能但在 Mali 項(xiàng)目里這是個(gè)非常危險(xiǎn)的操作。-marchnative會(huì)讓編譯器根據(jù)宿主機(jī)x86的 CPU 特性生成指令而不是目標(biāo) ARM 板卡的指令集。結(jié)果就是編譯出的程序根本跑不了或者出現(xiàn)非法指令。正確做法是明確指定目標(biāo) CPU 的微架構(gòu)比如-marcharmv8-asimd或更高版本。Mali GPU 本身和 CPU 指令集無關(guān)但用戶態(tài)驅(qū)動(dòng)的調(diào)用序列和方式與 CPU ABI 強(qiáng)相關(guān)。如果你在交叉編譯時(shí)不小心加了 host 相關(guān)的 flags鏈接階段可能不會(huì)報(bào)錯(cuò)但程序一上板就是 illegal instruction。這種錯(cuò)誤很難排查所以我建議在你的 CMakeLists 里加上set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} -marcharmv8-a) set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -marcharmv8-a)如果你的程序一定要用 OpenMP 或向量化再按目標(biāo)板卡的 CPU 核型如 Cortex-A76微調(diào)-mcpu參數(shù)。這個(gè)原則在“ARM Mali GPU links”這個(gè)主題下尤其重要Mali 庫本身是預(yù)編譯好的你的應(yīng)用只要遵循目標(biāo)板的 ABI鏈接就不會(huì)出問題。我在實(shí)際項(xiàng)目里見過太多因?yàn)?marchnative把整個(gè)工程搞得云里霧里的情況所以這里單獨(dú)拎出來提醒一下。7. 最后再分享一個(gè)實(shí)用小技巧用LD_DEBUGlibs看透一切加載細(xì)節(jié)如果你和我一樣是“肉眼調(diào)試派”那么LD_DEBUG環(huán)境變量絕對(duì)是你解決動(dòng)態(tài)庫鏈接問題的殺手锏。在板子上執(zhí)行LD_DEBUGlibs ./mali_demo你會(huì)看到動(dòng)態(tài)鏈接器打印出它查找每個(gè)庫的完整路徑find librarylibEGL.so.1 [0]; searching search path/usr/lib/aarch64-linux-gnu/mali/tls/aarch64:/usr/lib/aarch64-linux-gnu/mali/tls:/usr/lib/aarch64-linux-gnu/mali (LD_LIBRARY_PATH) trying file/usr/lib/aarch64-linux-gnu/mali/tls/aarch64/libEGL.so.1 trying file/usr/lib/aarch64-linux-gnu/mali/tls/libEGL.so.1 trying file/usr/lib/aarch64-linux-gnu/mali/libEGL.so.1這一段信息幾乎能解決所有“我明明設(shè)置了路徑但程序還是找不到”的困惑。比如它告訴你搜索路徑里有沒有 mali 目錄、是否因?yàn)?tls 子目錄不存在而被忽略。還有LD_DEBUGbindings可以看到符號(hào)綁定過程LD_DEBUGfiles看到文件打開關(guān)閉順序。真實(shí)項(xiàng)目中使用這招一個(gè)小時(shí)能頂你好幾天“猜謎式”調(diào)試。但注意LD_DEBUG輸出量很大會(huì)拖慢程序啟動(dòng)只適合調(diào)試時(shí)用。生產(chǎn)環(huán)境千萬不要留著。寫在最后ARM Mali GPU 的鏈接?xùn)|西說多不多說少也不少。你只要抓住“編譯時(shí)符號(hào)解析”和“運(yùn)行時(shí)動(dòng)態(tài)加載”這條主線再深入理解libmali在 BSP 體系中的定位大部分問題都能迎刃而解。我個(gè)人經(jīng)歷中最難的不是哪一條命令不會(huì)寫而是同時(shí)面對(duì)內(nèi)核驅(qū)動(dòng)、用戶態(tài)庫、CMake 交叉編譯鏈、運(yùn)行時(shí)環(huán)境變量這幾個(gè)環(huán)節(jié)時(shí)心智容易混亂。建議你調(diào)試時(shí)一次只動(dòng)一個(gè)變量改完路徑就ldd驗(yàn)證改完 CMake 就readelf -d驗(yàn)證不要一次性把所有參數(shù)全換掉。這樣即便報(bào)錯(cuò)也能快速回滾。如果你已經(jīng)能順利把 EGL Context 創(chuàng)建出來并且glGetString(GL_RENDERER)返回了 “Mali-…” 開頭的信息那恭喜你這一關(guān)過了。后面無論是寫渲染器、OpenCL 計(jì)算還是往 RKNN/NPU 異構(gòu)方案里塞 Mali 加速你都已經(jīng)有了扎實(shí)的底層基礎(chǔ)。希望這篇內(nèi)容能幫你在 ARM Mali 的板子上少走彎路早點(diǎn)跑出第一幀畫面。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
饮料下药迷倒漂亮女同事强干| 另类综合激情| 日韩少妇内射免费播放| 亚洲啪啪啪啪| www.99热视频| 天天日,夜夜爽| 一起肏在线视频| 97人人射| 99热亚洲| 综合狠狠伊人| 婷婷中文无码| 99精品大片| 91九色在线| 爱iii做iiii日日| 区美毛片子| 九九视频精品在线免费| 天天 青草 制服丝袜 在线| 97超碰婷婷五月天| 欧美性爱五月天| 天天干天天拍| 天天日 天天草| 久久久久综合激动五月天| 国产精品黑丝| 久久99久久99www| 天天色亚洲| 99热99热在线| 噜噜色婷婷| 九九99视频精品| 大香蕉 伊人夜| 久久AAAA片一区二区| 色婷婷成人网| 51XX午夜影福利| 色情五月天A片| 操一区| 婷婷五月在线| 久xxxx| 又大又粗九一在线| 黄色片久久| 色色色色热| 丁香五月激情网| 秋霞三及片| 亚洲九九99精品视频在线播放| 国产67194| 久久精品4| 婷婷月综合| 91碰九色| VA色婷婷| 丁香八月综合激情| 99热在线观看这里只有精品 | 五月丁香另类图片| 黄色aaaaa| 日韩欧美成人片| 操日本99| 欧美日韩国产日本精品四虎网网站物| 香蕉网久久| 另类图片五月激情| 狠狠色狠狠| 国产五月天婷婷| 丁香九色不卡aaa| 亚洲成人在线在线| 综合色吧| 99热免费网站| 日日爽天天| 婷婷五月天日日日干干干| 高清激情av在线观看| 五月婷婷另类| 欧美丁香五月天| 蜜桃婷婷丁香| 欧美久久婷婷| 丰满少妇乱A片无码| 97在线99| 色激情五月| 9999三级片| 91一起艹| 五月花婷婷丁香| 思思久热6| www.色婷婷.com| 激情网婷婷五月天| 国产精品国产成人国产三级| 国产伊人大香蕉| www.1024久久| 久久五月视频| 久久视频这里99| 国产亚洲精品久久一区二区三区| 91九色精品熟女内射| 人妻久久久| 日本综合99| 婷婷丁香综合| 日日色五月天| 成人网在线视频| 97久久久久| 九月婷婷久久| www。五月,com| 丁香九月激情久久| 丁香五月天婷婷久久| 狠色狠色综合久久| 五月天com| 无码少妇高潮喷水A片免费| 9久热在线精品| www.色婷婷| 深爱激情九九五月天 | 久久伦乱| 天天日天天干天天插天天射| 五月天.com| 97久久人人人干| 91|九色|动漫| 激情丁香图片| 内射 无码 伊人| 色色五月天网站| 五月天自拍视频| 人人摸人人| 99久久九九| 国内9l视频自拍老熟女九色| www 五月天 com| 久久作爱| 久久hd| 色综合天天网| 丁香五月天电影| 中文字幕高清av| 婷婷五月丁香av网站| 婷婷五月花西瓜| 大香蕉综合| www.AV在线| 婷婷六月丁香激情综合| 香蕉综合网| 人人爽欧美婷婷久久久五月丁香 | 国产日韩欧美性爱| 99热伊人综合| 日韩精品无码99| 激情五月天影院| 亚洲久艹| 狠狠草在线观看| 成人无码髙潮喷水A片| 色九九丁香九月色九九色| 婷婷激情五月天网站| 26uuu国产| 五月婷婷丁香91| 激情五月天色| 五月开心网| www.婷婷亚洲基地| 色色色色综合网| 中文在线成人| 激情四射五月天| 五月婷婷www| 日本成人小说婷婷六月| 亚洲无码性爱| 丁香婷婷六月男男| 久久电影4399| 五月丁香六月婷婷久久| 国产噜一噜天天噜| 996er热| 六月婷婷操逼| 99视频这里有精品免费观看| 一级AV片| aaaaaa片| 亚洲激情四射色| 99热国产| 亚州色色色| 91pornav在线| 五月天综合视频| 国产成人精品一区二三区熟女在线| 日本丁香久在线| 极品五月天| 色噜噜综合网| 婷婷伊人无码| 91婷婷视频| 青青操绿aaa一区日v| 色情五月丁香| 五月丁香久人妻中文| 夜夜骑天天操| 亚洲欧洲一二| 九九婷婷网五月天| 思思热99在线视频| 91九色成人原创视频| 青青草护士中出内射-欧美电影在线天堂新版 | 五月停性愛| 婷婷5月色| 深爱激情五月网| 欧美VA视频| 五月天婷网| 青草青草视频2免费观看| 7超碰自拍| 9|无码久久久久久| 久久色五月| 天天日天天爽| 狠狠操天天日| 超级碰 久久9| 曰曰久久| 婷丁香久综合| 电影91久久久| 99乱视频| 99热在线精品观看| 狠狠操综合| 日操五月婷| 99色综合| 色爱亚洲| AV九九| 国产精品久久..4399| 丁香婷婷五月综合影院| 久热免费视频| 国产精品热搜丁香五月婷婷| 色色婷婷丁香五月天| 九九精品99| 久久色天堂| 九月丁香亭亭| 久久久99精品| www.五月天色色.com| 五月婷婷激情网| 第四色婷婷日本| www.色婷婷| 婷婷开心青青草| 五婷婷综合网| 五月丁香色六月激情干大屄| 五月香婷婷| www.久久| 偷拍91九色| 丁香五月激情六月欧亚激情综合导航| 婷婷中文字幕网站| 大香蕉五月丁香| 成人视频九九| 久久总和99| 久久婷婷综合基地| 99热这里都是精品| 九九久久五月天综合伊人| 色婷婷亚洲综合天堂| 久久婷婷网| 26uuu美女三级视频| 夜色爱爱亚洲| 五月婷丁香| 中文字幕成人日韩| 久99热| 五月婷婷偷拍| 婷婷五月天亚洲图片| 中文久久婷婷| 99爱在线| 五月婷婷久久综合| 成人av中文字幕| 色青青视频| 久久综合首页| 黄色激情网站在线观看| 成人av在线网| 91九色在线| 深爱五月日韩| 天天综合永久| 六月伊人婷婷| 精品在线| 99色色爰| 超碰免费人人| 亚州精品色情在线观看| 久久丝丝热| 婷婷五月天丁香久久| 婷婷色色五月天| WWW.桔色成人.COM| 欧州色色| 久久精品只有这| 婷婷丁香五月激情综合站_久久五月丁香激情综合_开心五月综合激情综合五月_婷 | 黄色AV日韩| 五月天激情美女久久| 精品国产va久久久久| 久久五月婷综合网| 色噜噜狠狠狠狠色综合久欧美| www.夜夜| 五月婷婷六月丁香| 五月激情天| 韩国婷婷丁香五月| 日在线V视频在线播放| 99熟女| 草草影院爱爱| 精品亚洲日韩99欧美片| 中文字幕+中文在线| 99精品视频网站| 99熟女| 殴美综合激情五月天免费视频| 五月天激情日色在线| 久久人妻乱子伦| 99爱视频精品| 五月婷婷这里都是精品| 99久久er| 亚洲精品午夜国产va久久成人| 久热久色| 毛片色五月| 亚洲第一视频 久久| 先锋男人99资源| 思思久久网| 99热人人| 婷丁香五月天| 五月丁香婷庭在线| 99视频在线观看网址| 亚洲乱码在线观看| 激情五月影院| 成人无码精品1区2区3区免费看| 天天综合色| 天天操天天操天天操天天操天天操| 久久婷婷亚洲| 日韩啪啪视频| 婷婷99狠狠躁天天躁| 亚洲精品婷婷| 色五月婷婷在线| 99热在线观看| 九热视频免费观看| 97操视频| 色综合久久伊伊婷婷五月| 亚洲婷婷丁香五月天激情小说| 色丁香综合影院| w婷婷五月婷婷w| 日韩AV色色色| 99久在线精品99re8| 精品一二三区久久AAA片| 色色五月婷| 日本乱子人伦在线视频| 激情文学 综合 九月| 丁香久久九九99| 另类激情四射| 色天天狠狠干| 六月丁香五月激情网| 婷婷五月综合体验看| 五月丁香婷婷色色| 午夜精品人妻无码一区二区三区| 天堂亚洲 在线| 五月丁香大相交| 激情婷婷五月久久| 色丁香影院| 欧美大香蕉视频| 久久曰曰| 五月婷av| 五月婷婷久久综合| 狠狠狠狠狠| 亚洲欧洲另类| 婷婷综合网性| 99色看| 五月丁香在线| 天堂久久大香蕉| 99热国产精品| 婷婷色导航| 亚洲精品视频在线| 日韩精品超碰在线观看| 人人做人人看人人摸| 五月丁香激情综合网| 久久九九99| 激情内射人妻1区2区3区| www.99在线| 狠狠色狠狠色综合日日91| 五月丁香六月激情| 七月丁香婷婷 色色| 99热综合色图| 久久人妻久久| 强辱丰满人妻HD中文字幕| 99五月婷| 色婷婷九月| 天天操夜夜玩!| 99热91| 色综合综合综合| 国产成人AV在线播放| 久草xx性爱视频| 永久精品| 亚洲区,视频区,视频区免费| 中文字幕成人影视| 日本一级大片| 色综合激情| 激情六月天| 久久激情五月天| 天天噜| 五月婷婷 婷婷五月 一区二区 久久久 | 天天草天天爽| 亚洲A片成人无码久久精品青桔| 五月丁香激情四射| AV在线免费网站| 操b视频在线观看一区二区| 婷婷五月丁香av网站| 丁香激情网| 思思热99er| 天天做天天双| 成人精品一区日本无码网| 丁香激情网| 婷婷五月色| 操逼五月天| 日韩操逼小电影| 国产精品天天狠天天看| 日批在线看| 丁香五月婷婷啪啪| 三级成人网站| 大陆极品少妇内射AAAAAA| 色吧五月婷婷六月丁香| 青柠影视免费高清电视剧| site:hcxsz888.com| 激情五月天色色| 久9热视频在线观看| 国产这里只有精品| 五月丁香六月成人| 大香蕉啪啪啪| 综合网五月天123| 五月天综合在线网| 亚洲99热| 色域五月婷婷丁香| 色99视频| 欧美综合激情五月丁香| 午夜激情婷婷| 亚洲 六月 综合| 久久五月婷综合| 日日夜夜天天爽| 三日本无码| 9这里只有精品| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 99热在线播放| 五月丁香婷婷中文网| 99热在线观看| 亚洲丁香五月| 久久亚洲A| 中文字幕乱码亚洲精品一区| 亚州AV超碰人人操| 六月婷色| 99爱视频| 五月天六月婷| 国产性爱一级| 久久久五月天婷婷| 婷婷色九月| 激情婷婷内射| 亚洲视频在线观看区| 激情五月天视频| 91视频一起草| 99国产在线精品视频| 丁香五月婷婷基地| 欧美色骚婷婷五月天| 久久久久9久无码视频| 五月激情婷婷国产精品久久久久久| 看全色黄大色大片| 色婷婷成人做爰A片免费看网站| 色婷婷亚洲在线| 久久一品区| 亚洲色无码A片一区二区麻豆| 亚洲视频图片婷婷五月| 色色永久| www.99日本| 熟妇人妻中文字幕无码老熟妇| 色99热| 超碰99久久| 国产高清视频91九九九久久久| 国产午夜精品一区二区| 五月久久噜噜| 五月色婷婷中文字幕| 亚洲精品又粗又大又爽A片 | 天天操婷婷| 色综合色综合色综合高潮| 午夜在线成人网站免费观看| 婷婷五月激情四射手| 婷婷综合视频| 激情五月天伊人影院| 99色婷婷| 日本三级毛片| 99热在线极品极品| 99热91| 天堂久久精品| 激情综合网 激情五月天| 国产激情在线| 丁香五月综合激情久久潮喷| 无码激情AAAAA片-区区| 天天搞天天爽| 日韩人妻无码精品| 天天久综合| 五月香六月婷| 99re这里只有精品首页| 九九九精品视频免费观看| 婷婷人妻激情| 亚洲成人在线观看网址| 一二线视频 另类| 26UUU欧美激情一区二区| 爱的综合网| 亚洲人成网亚洲欧洲无码久久| 五月综合丁| 最近免费中文字幕大全高清大全1 免费看欧美成人A片无码 | 欧美激情 日韩无码 婷婷 五月天| 亚洲成人网址在线观看| 青青草伊人婷婷| 九九热这里| 97啪啪| 亚洲操精品| 色婷婷社区| 丁香五月人妻熟女| 婷婷丁香五另类网站| 狠狠搞五月天| 婷婷丁香社区网| 久久精品视频99| 超碰人人91| 六月激情丁香一道本7777| 久久精品凹凸分类| 99色在线观看| 色五月天电影| 丁香婷婷性久久| 激情都市丁香婷婷| 日日日日日| 26uuu成人网| 日韩啊啊啊| 91se在线视频| 超碰成人免费| 婷婷精品视频| 亚洲亚洲人成综合网络| 亚洲AV成人无码精品| 成人超碰网| 丁香五月激情图片婷婷| 激情啪啪五月| 婷婷大香蕉| 97色婷| 婷婷五月激情热播| 亚洲九九99精品视频在线播放| 97人人射| 五月丁香久久久| 色丁香影院| 夜夜爽天天| 日韩黄黄| 五月丁香中文字幕| 成人婷99最新| 九九综合影音先锋| 成人 AV播放| 九色地址91视频| 91ncm视频| 97人人干| 久久开心五月婷婷| 熟女五月天久久综合| 婷婷五月激情视频在线| 亚洲成人在线综合| 99视频在线| 五月丁香婷婷色啪| 六月婷婷七月丁香| 99re这里只有精品9| 五月天影院| 欧美啪啪9| 婷婷丁香人妻天天爽| 国产成人AV| 丁香花五月天社区| 97成人丁香婷婷| www.久久av.com| 91在线日| 青青久在线视频免费观看| 99热精品99| 一区二区三区四区五区| 99热这里只有精品4| 婷婷久热| 超碰妻人人| 69精品人妻不卡视频| 青青夜夜狠狠夜夜狠狠| 欧美这里只有精品| 粉嫩AV久久一区二区三区| 一级性感毛片| 久色姿源| 色色色国产| 五月婷婷丁香大香蕉| 热99国产精品| 色99在线观看| 久久精品凹凸分类| 99热九九这里只有精品| 99久久五月婷婷| 五月丁香在线观看国产| 色亚洲中文| 五月天婷婷基地| 亚洲日本韩国| 欧洲综合视频| 99热这里有精力| 九月丁香久久网| 精品五月视频婷婷在线观看| 狠狠色成人影片| 成人免费120分钟啪啪| 91无码高清| 日本人人xxx| 97高清国语自产拍| 香蕉婷婷色五月| 天天插天天日| 日韩精品在线观看9| 丁香久久AV| 欧美久久婷婷| 日本黄色三级片内射| 五月天六月丁香| 美欧成人视频| 激情五月天婷婷色色色色色色色色色色色| caopeng97日韩| 婷婷五月天黄色| 在线日本www| 这里只有精品2| 国产精产国品一二三在观看| 久久综合网免费视频| 国产在线中文字幕| 综激情网| 丁香五月婷婷av| 国产 亚洲 在线| 色综合九九色综合88| 人妻AV中文系列| 婷婷五月天色| 97精品综合久久| 67194中文字幕| 99在线69| 婷婷九月| 婷婷五月av| 久久天天天| 操人无码| 五月婷婷与六月丁香图片激情| 99热欧美| 五月激情综合五月| 操碰色一区就去操| 婷婷精品性性性性性性性| AV在线不卡播放| 人人操Av| 激情婷婷丁香五月| 五月花综合视频| 亚洲AV成人无码精品| 五月天黄色激情小说| 日日操天堂| 九九热视频在线观看| 九月色婷婷综合| 欧美啪啪9| 久9热在线视频| 色色操| 99热成人精品| 97成人在线视频| 婷婷五月六月| 激情五婷网| 日本婷婷| 99热这里只有精品无码| 九九这里是免费的视频5| 亚洲综合九九| 天天肏天天插| 免费看片在线观看| 五月天婷婷免费| 狠狠色激情在线| 丁香婷婷婷| 婷婷五月天av| 综合五月草| 五月天sesese| 97色婷婷| 丁香五月婷婷欧美成人色图| 九九青草热| 99热97| 亚洲VA在线| 日韩成人AV在线| 国产精品人成A片一区二区| 婷婷五月深深爱| 色五月超碰| 蜜桃人妻无码AV天堂三区| 亚洲综合色网站| 国产成人精品一区二三区熟女在线| 夜夜骑日日夜夜| 色约约视频一区二区三区四区五区 | 久久婷婷五月天| 精品色色色| 超碰在线精品| 91人人爱| 91热在线| 婷婷五月综激情| 日日操,日日爽| 大香蕉75线| 欧美丰满熟妇BBB久久久| 五月天婷婷色小说| 噜噜噜噜噜日本视频| 一级性感毛片| 国产真人做爰视频免费| 亚洲区视频| 婷婷五月天人妻| 五月丁香六月婷婷,婷| 婷婷五月激情综合啪啪| 粉嫩AV久久一区二区三区| 婷婷99狠狠| 91视屏在线观看com.wwwvv| 丁香五月婷婷深爱综合激情| www.久久婷婷| 99在线视频。| XX色综合| 亚洲综合另类| 香蕉操亚洲| 99热这里只有精品一区| 色色综合日韩| 桃色五月婷婷| 五月天第四色开心色播| 久久久.COM| www.金莲av| 丁香色婷婷| 影音先锋一区| AA丁香综合激情| 婷婷五月丁香欧洲| 日韩1区2区| 婷婷五月天亚洲精品| 久久九九玖玖| 五月天激情黄色小说在线观看| 久七香蕉| 色99免费视频中文| 久久青草国| 97香蕉人人在线观看| 超碰在线免费观看3 9| 综合久久99| 96丁香六月婷婷蜜桃综合久久| 五月婷婷五月| 五月丁香婷婷色色| 激情综合色图| 91成人电影| 五月婷丁香| www.日日夜夜.com| 亚洲AV综合网| 91色在线/日韩| 丁香婷婷色色| 亚洲国产成人在线| 日本色狠狠| 丁香五月婷婷偷拍| 久久作爱| 99热一区| 亚洲色色色| 另类婷婷五月天啪帕帕| 变态另类色图| 欧美日韩国产日本精品四虎网网站物| 色噜噜狠狠色综合日日| AA片在线观看视频在线播放| 大地9中文在线观看免费高清| 欧美精品XXXXBBBB| 婷婷五月天VI| 青青草tp| 九九视频这里是精品五月| 79亚洲精品少妇| 99er这里只有精品| 久久亚洲精品成人无码网站导航| 啪啪六月婷婷| 激情五月久久| 久久激情网| 天天干天天做| 婷婷五月天AV在| 久久99综合网| www.99久| 国产日日夜夜操| 天天肏高清在线| 五月婷婷色| 国产精品VIDEOSSEX久久发布| 亚洲无AV在线中文字幕| 91猫咪国产在线播放| 色色激情五月天| 精品综合久久久久久五月天| 毛片毛片毛片毛片| 8区视频在线| 日本www免费九九| 超碰97免费在线| 热九九在线| 国语精品探花| 亚洲色婷婷| 婷婷丁香色五月| av中文字幕免费观看| 久久久五月天网站| 97操在线视频| 五月丁香六月激情在线| 久热91| 色婷婷啪啪| 五月丁香六月色婷婷综合五月天| 激情综合激情综合| 99碰碰| 激情九九六月激情免费视频| 国语对白性爱视频播放| 色色色色综合网| 久久婷婷五月天丁香| 欧美在线操| 五月丁香六月花| 国产成人精品亚洲线观看| 射久久丁香五月| 六月丁香婷啪射| 五月天天综合| 国产亚洲精品久久久久久郑州| 肏日网在线看| 开心久久五月天| 婷婷六月天激情| 蜜桃人妻无码AV天堂三区| 亚洲婷婷91丁香| 五月天色裸体视频| 91婷婷| 久久电影4399| 五月天婷婷色色网| av婷婷丁香| 久久视频这里都是精品| 大香蕉九操| 成人视频在线免费播放| 性生活久久人妻| 直接看的av| 五月天丁香婷婷社区| 天天天操天天天日| 综合aV在线| 人妻性爱av网站| 激情图片婷婷| 香蕉操亚洲| 婷婷五月天综合久久| 色135综合网| 亚洲精品色色| 丁香五月性| 日韩欧美一级大黄网站| 色综合五月天| 五月色婷婷夜色| 亚洲热视频在线| 国产99久| 色五月天视频| 99原创自拍视频在线观看| 五月天婷婷久色| 狠狠五月天| 婷婷丁香社区网| 婷婷色正月| 激情四射婷婷色色色| 婷婷五月视屏| 综合五月激情| 婷婷五月天六月综合| 日韩一区二区A片免费观看| 二人电影免费版在线观看| av九九| 99热在这里只有免费精品| 丁香五月婷婷在线| 综合狠狠伊人| 99色色| 婷婷激情综合网| 熟女少妇内射日韩亚洲| 99热日本| 色婷婷激情Av久久久| 色五月婷婷激情| 热久91| 无码色色色| 亚洲午夜一区二区| 综合激情视频| 亚洲第一色色色| 疯狂做受XXXX高潮A片动画| 婷婷va| 久久久精品色| 一区二区三区四区五区| 99视频| 激情综合五月婷婷| 久久网日本| 狠狠五月天| 日韩成人五月天| 欧美激情 日韩无码 婷婷 五月天| 丁香五月天啪啪a日本| 日本黄色精品| 久久九区| 九九婷婷五月天影视| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 这里只有精品视频在线| 色噜噜,噜噜色| 五月Huangsewang| 碰97久久| 久鲁鲁色网| 免费视频在线观看的网站| 亚洲激情精品| 一起草av| 亚洲成人AV高清字幕| 精品五月天| bbwcuckold精品熟妇| oumeisesewang| 婷婷丁香五月综合网| 激情综合激情五月一起草| 9在线9在线婷婷在线国产| 99a级片| 久久亚洲婷婷综合色五月| 九九综合九| 色五月丁香网| 五月丁香婷婷激情澎湃四射| 九九干视频| 亚洲天堂久久| 亚洲AV综合网| sewuyuejiqingwang| 色99婷婷五月天| 欧美婷婷色| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 亚洲综合无码| 99在线观看这里都是精品| www超碰com| 91九色首页| 亚洲综合色网| 五月色婷婷综合丁香精品无遮挡| CAOBIBI| 开心五月深爱五月| 五月激情综合深爱| 婷婷久久大香蕉| 国产一级视频a| 99视频在线| 丁香六月欧美| 婷婷综合欧美| 狠狠精品干练久久久无码中文字幕| 99这里| 色在线五月天免费| 婷婷五月在线综合| 伊人9在线| 婷婷综合中文| 深爱五月天| 成人看片网站| 熟女激情五月天 | 五月天婷婷深深爱| 超碰人人艹| 99热国内精品| 五月婷视频在线观看| 国产99久久久国产精品免费看| 2025最新亚洲激情在线| 视频这里只有精品| 国产肏屄大片| 五月天大香焦| 一级视频网址| 国产欧美性成人精品午夜| 五月天色色网站| 天天操天天谢| 99热这里只是精品| 热的国产,热的综合,热的有码 | 久久欧洲综合网| 五月六月丁香激情视频| 国产成人av在线播放| 五月天色综合| 激情无码网| 亚洲综合欧美色丁香婷婷888月图片 | 九九99精品视频| 久久99草五月婷婷| 成人做爰黄A片免费看直播室男男| 色婷婷激情| 狠狠爱综合| 色女人久久| 九九热精品| 丁香五月婷婷av| 激情五月久久| 99热这里只有精品在线观看| www·五月天| 婷婷欧美激情综合| 思思热闹这里只有精品| 日韩婷婷| 无码天天操| 九九视频这里只有精品在线播放 | 色域五月婷婷丁香| 精品久热69| 九九亚洲视频| 婷婷六月色| 久热久| 六月婷婷影院| 另类视频丁香五月| 亚洲久久婷婷丁香五月天| 亚洲射激情| 五月天亚洲色| 天天操婷婷| AV色婷婷| 婷婷五月花| 亚洲经典三级| 国产午夜伦鲁鲁| 亚洲AV另类| 六月婷婷综合久久| 999热在线视频| 国产乱码久久| 四虎婷婷五月天| 五月婷婷六月奇米网丁香| 五月丁香久久| 色丁香六月| 天天色天天爱天天爱天天爱y| 人。妻久久| 人人草人人爱| 专区无日本视频高清8| 成人综合视频网址| 91婷婷色五月| 五月丁香久久综合| 涩涩涩婷婷| 久久综合中文字幕| 人人播| 婷婷色影音天| 久久丁香网| 日本免费91| 97人妻碰碰碰久| 色色色综合视频| 九九在线精品| 99精品视频在线观看| 国产AV熟妇人震精品一品二区| 182TV大香蕉| 精品国产va久久久久| 天天狠狠色噜噜| 六月婷婷激情| 一本色道久久88加勒比| 97操| 亚洲99视频| 性爱久久| 五月天成人综合| 亚洲天堂啪啪| 天天模,夜夜模夜夜爽| 玖玖精品视频| 九九九激情综合| 久久久五月天网站| 影音先锋按摩| 激情五月天啪啪| 99精品偷自拍| 色五月婷婷AV| 五月开心深深爱激情综合| 六月婷婷av| 中文字幕无线久必| 五月色婷婷综合色| 五月开心激情| www.狠狠| 亚洲AV免费在线| 日日日日操| 久久狠狠干| www.婷婷六月天| 激情五月天小说视频| 亚洲欧美婷婷五月色综合| 中文成人在线| 五月婷婷色男女| 26uuu丁香婷婷五月| 久久一操| 99久热这里有精品| 激情九九六月激情免费视频| 香蕉99网| 欧美激情五月天在线观看| 久久婷婷五月综合色丁香| 综合九九日本| 日本ww亚洲| 99ri在线视频| 婷婷五月天奸女| 亚洲热久久| 亚洲精品久久久无码| av在线超清中文| 久久久久久97| 精品自拍99| 婷婷五月天激情基地| 五月婷婷丁香| 91操碰| 91人妻PORNY九色大屁股| 午夜九九九九九九| 天天成人综合视频| 综合 激情 婷婷| 激情深愛五月視頻| 五月天久久91| 久久九精品| 欧美成人五月天| 五月激情久久综合网| 日韩二区搞逼插逼毛片| 亚洲一色色色色色色色色| 五月丁香激情综合网| www婷婷色| 丁香 婷婷五月| 精品成人无码A片观看香草视频| 国产成人网站在线观看| 婷婷社区五月天| 丁香五月综合激情性爱| 五月天网站免费欧美| 91操女| 色婷久| www,色综合| 久久九九免费视频| 婷婷五月大香蕉| 五月丁香六月婷婷成人电影| 狠狠色丁香婷婷| 操操人人| 91丨九色丨白浆| 99久在线精品99re8| 六月丁香av| 色欲天天综合| 欧洲亚洲免费视频区| www.99热| 婷婷黄色五月天在线视频| 亚洲宗合激情| 狠狠插狠狠| 日韩精品呦呦va| 婷婷五月天AV在线| 九九综合网色全集 | 亚洲丁香五月| 色香蕉婷婷| 欧美激情VA永久在线播放| 婷综合六月| 可以免费观看的AV| 婷婷色五月噜噜| 专区无日本视频高清8| 丁香五月激情天AV无码| 91干婷婷| 色婷婷丁香五月天在线观看| 人妻综合网| 五月天综合| 婷婷六月丁香激情综合| 日韩精品无码AV| 婷婷操超碰| 97人人操人人| 成人五月丁香花| 啄木鸟丝袜美女福利视频| 成人国产网| 婷婷亚洲五月| 在线成人网址| 超碰操日| 五月天婷婷视频小说| 中文不卡av| 99久久99久久综合| 天天综合干| 日本一毛片| 26uuu日韩| 色婷婷五月综合网| 欧美内射AAAAAAXXXXX| 天天看夜夜看| 丁香五月婷婷偷拍| 思思9久久| 久久精品人妻| 亚洲国产色婷婷| 999久久久国产精品| 九九99久久| 精品成人a v无码内射| 久热黄色| 三年高清大片免费观看国语| 影音先锋噜一噜| 激情婷婷亚洲五月| 亚洲愉拍99热成人精品| 99久久66综合| 欧美日韩成人在线网| 婷婷五月天成人综合网| 五月丁香六月婷婷成人| 啪啪啪丁香五月| 99re这里| 六月丁AV| 久久狠狠色| 99视频在线播放大全| 伊人天堂婷婷| 色色色色网| 丁香五月天中文字幕| Va另类视频| 99在线播放视频| 色香久久| 婷婷五月欧美综合| 五月婷婷激情| 人妻无码精品一区| 狠狠艹狠狠艹| 六月婷婷激情| 91碰操| 久久A V无码视频| 婷婷成人五月天一区| 五月色丁香| 婷婷丁香五月91| 婷婷五月丁香图片人人操| 色婷婷久久| 婷婷五月天六月丁香| 丁香六月婷婷高清| 亚洲中文无码成人| 26.uuu丁香五月婷婷| 2015WWW永久免费观看播放| 日韩无码专区| 夜夜爽天天干| 99热久| 丁香久久五月婷综合| 久久久无码精品成人A片小说| 6080av| 噜色精品| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 天天综合久久| 人人干99| 成片免费观看大全| 婷婷久久在线| 青青久久五月| 久操乱| 亚洲国产精品SUV| 综合色99| 俺去也五月天| 五月天成人综合| 色情五月婷婷| 久色大| 大香蕉99| 天天肏天天肏天天肏| 日韩AAA| 色五月婷婷久久大| 婷婷瑟五月天久久综合| 这里只有免费的精品| 五月婷婷六月激情在线| 九九婷婷五月天影视| 色色影院aaaav| 99视频内射三四| 亚洲精品操一操、噜一噜、摸一摸、爽 | 丁香六月久久| 69久久99精品久久久久婷婷| 五月丁香伊人网| 开心色五月天久久久久久久| 成人电影丁香六月天| 五月天狠狠| 亚洲综合激情五月久久| 91九色丨国产丨爆乳| 综合激情在线| 97色色网| 色色婷婷五月| 婷婷综合在线| 日韩免费视频| 国产成人精品一区二三区熟女在线| 婷婷5月久久综合网站| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 91人人操| 97干网站| 91人人网| 九九黄色网| 久久婷婷五月综合| 丁香婷婷久久 | 色综合天天综合成人网| 色五月婷婷亚洲| 婷婷丁香五月色| 亚洲人成色A777777在线观看| 可以看的AV| 久热伊人| 婷婷久久色| 婷婷五月中文字幕| 天堂婷婷五月在线| 五月激情五月丁香| a九九热www| 桔色成人官方网站| 五月天停停成人网| 婷婷伊人网| 日韩无码专区| 青青草婷婷久久| 91丨九色丨丰满人妖| 夜夜操少妇| 亭亭五月色男人| 激情综合五月天| 丁香五月婷婷综合啪啪| 婷婷狠狠青青| 永久的网站AAAA| 六月伊人婷婷| 4399亚洲视频| 超碰99热| 久re热视频| 婷婷五月天国产精品| 日日爱激情| 亚洲午夜AV| 亚洲中文AV网站| 久99综合婷婷| 激情五月天色色| 六月丁香深深爱| 亚洲综合丁香婷婷六月天| 综合久久影院| 日韩免费视频| 色五月婷婷基地| 国产精品国产VA片国产| 91蜜桃婷婷狠狠久久综合9色| 青青久在线视频免费观看| 欧美日综合| 狠狠狠狠狠草| 亚洲综合五月天婷婷丁香| 色色999三级片| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 色狠狠综合网| 激情综合五月丁香六月婷婷| 极品色丁香| www.久久av.com| 久久久这里有精品| 精品99在线看| 丁香婷停五月激情综合深爱| 99热97| 我想看国产大学生口爆吞精的视频| 男人天堂亚洲综合| 久色激情| 99在线视频观看| 日本九九九九| 五月天综合影院| www99热| 99爱在线| 九九热这里只有精品5| 激情五月综合ì香亚洲| 香蕉久久国产AV一区二区| 性爱激情小说AV五月丁香花| 五月开心激情网| 丁香五月婷婷网| 激情另类综合| 婷婷丁香人妻天天爽| 996re热精品视频| 青青草搞屄视频网站| 99热一区| 婷婷成人AV| 激情综合网激情五月天| 黄急一级视频| 婷婷狠狠五月综合| 午夜大香蕉| 日韩婷婷| 噜啊噜在线| 六月丁香婷婷色狠狠久久| 9久热这里只有精品| 99久热视频在线| 婷婷五月激情基地| 午夜性做爰电影| 五月天久久久| 五月天综合婷婷| 九九re精品视频在线观看| 五月停亭六月,六月停亭的英语| 伊人丁香在线|