[英]Calling aarch64 shared library from amd64 system, maybe using binary translation/QEMU
我有一個用於 Linux 的 aarch64 庫,我想在 amd64 Linux 安裝中使用它。 目前,我知道一種讓它工作的方法,即使用qemu-arm-static
二進制模擬器和我自己編譯的 aarch64 可執行文件,它在 aarch64 庫上調用dlopen
並使用它。
令人煩惱的是,將 aarch64可執行文件與我的 amd64 環境集成很煩人(例如,假設這個 arm64 庫來自物聯網設備並實時解碼特殊的視頻文件——我應該如何使用本機庫在我的電腦上玩嗎?)。 我最終使用了 UNIX 管道,但我真的不喜歡這個解決方案。
有沒有辦法我可以只使用庫的qemu-arm-static
東西,所以我可以有一個直接調用庫的 amd64 可執行文件? 如果不是,那么在這兩種架構之間進行交互的最佳方式是什么? 是管道嗎?
我為此實施的解決方案是使用共享的 memory IPC。
假設您有一個帶有簽名int32_t so_lib_function_a(uint64_t b, uint32_t c[2])
的 function
您可以在 amd64 庫中編寫包裝器 function: int32_t wrapped_so_lib_function_a(uint64_t b, uint32_t c[2])
。
然后,您創建一個共享的 memory 結構:
typedef struct {
uint64_t b;
uint32_t c[2];
int32_t ret;
int turn; // turn = 0 means amd64 library, turn = 1 means arm library
} ipc_call_struct;
像這樣初始化一個結構,然后運行shmget(SOME_SHM_KEY, sizeof(ipc_call_struct), IPC_CREAT | 0777);
,從中獲取返回值,然后獲取指向共享 memory 的指針。 然后將初始化的結構復制到共享的 memory 中。
然后在 ARM 二進制端運行shmget(3)
和shmat(3)
,同時獲得指向共享 memory 的指針。 ARM 二進制文件運行一個無限循環,等待它的“轉”。 當turn
設置為1
時,amd64 二進制文件將一直阻塞,直到turn
為0
。 ARM 二進制文件將執行 function,使用共享結構詳細信息作為參數,並使用返回值更新共享 memory 結構。 然后 ARM 庫將turn
數設置為0
並阻塞直到turn
數再次為1
,這將允許 amd64 二進制文件執行其操作,直到它准備好再次調用 ARM ZC1C425268E18385D1ABZA504F。
工作示例即將推出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.