Compiling

在 Ubuntu Linux 16.04 桌面上執行的 C# 執行檔在哪裡使用 DLLImport 的共享對像在執行時查找它們的原始碼?

  • May 20, 2016

在 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採用冒號分隔的目錄列表進行搜尋。但是,如果您使用它,核心會丟棄程序的所有權限 - 因此您不能使用它來欺騙passwdsudo,例如。

我們如何全域指定 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

我已經使用"$@",以便將傳遞給腳本的任何參數應用於執行檔本身。

我不知道您將如何啟動或停止單聲道服務,因此我無法為您提供具體的幫助。如果你更新你的問題,我會看看是否有什麼我可以在這裡添加的。

引用自:https://unix.stackexchange.com/questions/284247