簡體   English   中英

從 amd64 系統調用 aarch64 共享庫,可能使用二進制翻譯/QEMU

[英]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 二進制文件將一直阻塞,直到turn0 ARM 二進制文件將執行 function,使用共享結構詳細信息作為參數,並使用返回值更新共享 memory 結構。 然后 ARM 庫將turn數設置為0並阻塞直到turn數再次為1 ,這將允許 amd64 二進制文件執行其操作,直到它准備好再次調用 ARM ZC1C425268E18385D1ABZA504F。

工作示例即將推出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM