在 Ubuntu Linux 16.04 桌面上執行的 C# 執行檔在哪裡使用 DLLImport 的共享對像在執行時查找它們的原始碼?
在 Ubuntu Linux 16.04 Lenovo Thinkstation 桌面上執行的 C# 執行檔在哪裡使用 DLLImport 的共享對象(so’s)在執行時查找共享對象的原始碼?即使共享對象 libxyz.so 與 C# 執行檔的子目錄位於同一子目錄中,我發現有必要導出 LD_LIBRARY_PATH 以確保正確的 C# 可執行程序行為。為什麼會這樣?
我們注意到,在許多第三方 Linux 軟體產品的安裝過程中,安裝程序或腳本設法在 /usr/libx86_64-linux-gnu 子目錄中找到 libc.so.6,而無需客戶指定包含該子目錄的 LD_LIBRARY_PATH。為什麼會這樣?
另外,如果我們希望將 C# 執行檔作為一個點執行並點擊 mono-service,我們如何全域指定 LD_LIBRARY_PATH,直到電腦重新啟動,而無需打開 Ubuntu Linux 16.04 終端?有沒有比將 LD_LIBRARY_PATH 作為 envp 參數傳遞給 execle 更優雅的方法?
我會盡力為你回答這個問題的所有三個部分
$$ Why is it $$必須導出 LD_LIBRARY_PATH 以確保正確的 C# 可執行程序行為 安裝程序或腳本設法在 /usr/libx86_64-linux-gnu 子目錄中找到 libc.so.6,而無需客戶指定 LD_LIBRARY_PATH
連結庫是從一組已知位置引用的。通常這些是系統目錄,因此特權程式碼可以安全地使用它們(它們不能被使用者覆蓋)。
一旦你理解了這一點,你就會意識到一組已知位置不能不包括
.
. 通過檢查文本文件,您可以看到一組已知位置/etc/ld.so.conf
。如果您編輯它,您必須執行ldconfig
以更新其對應的二進制數據庫。可以通過使用 的實例來擴展每個應用程序的已知位置集,該實例
LD_LIBRARY_PATH
採用冒號分隔的目錄列表進行搜尋。但是,如果您使用它,核心會丟棄程序的所有權限 - 因此您不能使用它來欺騙passwd
或sudo
,例如。我們如何全域指定 LD_LIBRARY_PATH,直到電腦重新啟動
$$ … $$有沒有比將 LD_LIBRARY_PATH 作為 envp 參數傳遞給 execle 更優雅的方法?
將其設置為全域將是一個非常糟糕的主意,因為它會破壞
sudo
,passwd
和其他特權程序。不過,我不明白為什麼你不能LD_LIBRARY_PATH
在每個應用程序中設置一個 shell 腳本。您不需要將其作為“終端程序”啟動,因為它不會向終端寫入任何重要的內容#!/bin/bash # APP_DIR=/path/to/application APP_DIR_LIB="$APP_DIR/lib" APP_DIR_EXE="$APP_DIR/someprogram.exe" export LD_LIBRARY_PATH="$APP_LIB_DIR"${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" exec "$APP_DIR_EXE" "$@" echo "Ooops" >&2 exit 1
我已經使用
"$@"
,以便將傳遞給腳本的任何參數應用於執行檔本身。我不知道您將如何啟動或停止單聲道服務,因此我無法為您提供具體的幫助。如果你更新你的問題,我會看看是否有什麼我可以在這裡添加的。