Filesystems

在 OS-X 上隱藏或屏蔽程序的目錄

  • August 10, 2016

是否有一種方法可以讓程序(沒有根)為自己隱藏或掛載到文件系統的路徑上?它不應該影響實際的文件系統,只影響程序本身以及它的子程序?

有點奇怪的案例,但我需要在 OSX 建構伺服器上建構一些東西,就好像它是一個普通的 OSX 機器一樣。但是不幸的是,安裝了一些庫,/usr/local/{include,lib}這些庫使建構變得混亂,而且我在機器上沒有 root。所以我想/usr/local在跑步時暫時躲configure起來make

我沒有寫權限,/usr/local所以我實際上無法修改它。

不,沒有直接的方法可以做到這一點。您可以使用Finderchflags hidden隱藏內容,但這不會影響命令行。

解決方案將取決於配置腳本。它可能會簡單PATH/usr/local查看/usr/local. 要解決前者(PATH基於 -),您可以調整路徑。對於後者,唯一有效的方法是修改configure腳本。

您會看到硬編碼列表的原因是附加組件可能不會使用與系統其餘部分相同的搜尋路徑。例如,各種 BSD 埠可能使用/usr/pkg/usr/local等,並且部分依賴打包程序在其建構腳本中設置這些路徑名。但是,不是作為 ports 系統的一部分建構的程序必須在那些地方尋找東西,以便在幾乎沒有使用者關注的情況下建構。

如果要覆蓋 OSX 的預設搜尋路徑,請從ld手冊頁開始,其中顯示

搜尋路徑

ld維護目錄列表以搜尋要使用的庫或框架。則預設庫搜尋路徑為. 該選項將添加一個新的庫搜尋路徑。預設的框架搜尋路徑是then。(注意:以前,位於預設路徑的末尾。如果您需要該功能,則需要顯式添加 )。該選項將添加一個新的框架搜尋路徑。該選項將刪除標準搜尋路徑。該 選項將為所有搜尋路徑添加前綴。/usr/lib/usr/local/lib-L/Library/Frameworks/System/Library/Frameworks/Network/Library/Frameworks-F/Network/Library/Frameworks-F-Z****-syslibroot

並且您可以通過在選項ld前面加上-Wl(並在需要空格時使用逗號)來傳遞選項。為了您的目的,您將編寫一個腳本

  • 用於-Z刪除搜尋路徑,以及
  • 添加回您需要使用的部分-L

clang選項-v顯示編譯器前端的詳細資訊,並傳遞-vld,例如,使用-Wl,-v顯示連結器的詳細資訊。

像這樣的東西,例如:

#!/bin/sh
clang -Wl,-Z -L/usr/lib -F/Library/Frameworks -F/System/Library/Frameworks "$@"

手冊中沒有記錄它clang,但快速檢查表明它會將一個簡單的-Z選項傳遞給連結器。另一方面,clang文件選項(主要用於 gcc 兼容性)是否會抑制其搜尋不同類別的包含目錄:

  -nostdinc
         Do not  search  the  standard  system  directories  or  compiler
         builtin directories for include files.

  -nostdlibinc
         Do not search the standard system directories for include files,
         but do search compiler builtin include directories.

  -nobuiltininc
         Do not search clang's builtin directory for include files.

它沒有顯示包含文件的搜尋路徑的選項,但您可以通過執行預處理器來推斷。

一旦你讓腳本工作,然後執行configure腳本,你將設置CC為該腳本的名稱,例如,

./configure CC=cc-system

我已經這樣做了一段時間,但不需要這種特殊的組合(請參閱編譯器包裝器)。

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