Libraries

如何更改單個終端實例的共享庫(.so 文件)的路徑

  • March 26, 2016

我想刪除連結器用於查找 .so 庫以進行測試的一些路徑。

我找到了一種添加庫路徑的方法:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library"

是否有一個類似於LD_LIBRARY_PATH我可以用來刪除庫路徑的變數,例如/usr/local/lib不在/usr/libLD_LIBRARY_PATH由連結器拾取的庫路徑?即如何忽略 /etc/ld.so.conf.d/ 中給出的路徑?

這樣做的原因是我正忙於創建一個程序,對於給定的執行檔,它遞歸地查找庫依賴項。我想看看是否可以通過查找程序的所有依賴項、將這些依賴項複製到本地目錄並製作本地執行的 bash 腳本來設置 LD_LIBRARY_PATH 然後執行執行檔來使程序更具可移植性。我想測試這個本地執行執行檔是否在刪除以前重要的庫搜尋路徑後工作。

如果給定的共享庫通過rpath功能嵌入了路徑,您會對刪除庫路徑感興趣。這些是在連結器創建庫時添加的。

您可以使用刪除(或更改)這些路徑chrpath,例如,

chrpath -d mylibraryfile.so

LD_LIBRARY_PATH變數中刪除路徑名也是一個可能感興趣的領域;您可以通過字元串替換和重新導出變數來做到這一點。但是,問題似乎與此無關。沒有變數可以抵消LD_LIBRARY_PATH

對於查看庫依賴項,提及/etc/ld.so.conf.d/聽起來好像平台只是 Linux。您可以使用ldd列出依賴項。除了 OSX,所有的 BSD 也支持ldd. 這是我為此目的使用的腳本之一:

#!/bin/sh
# $Id: ldd-path,v 1.1 2007/07/09 19:30:28 tom Exp $
# Edit the output of ldd for the given parameters, yielding only the
# absolute pathnames.
ldd $* | sed \
       -e 's/([^)]*)//g' \
       -e 's/^.*=>//' \
       -e 's/[         ][      ]*//g' \
       -e '/^$/d'

但是(解決評論),沒有可移植的機制來告訴載入程序忽略現有路徑。GNU ld 文件總結了所尋求的內容,以及-rpath選項描述中的順序。這些項目結束了列表:

  • 預設目錄,通常/lib/usr/lib.
  • 對於 ELF 系統上的本機連結器,如果文件/etc/ld.so.conf存在,則在該文件中找到的目錄列表。

進一步閱讀

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