2011-03-31 46 views
0

我有一個C++共享庫,它作爲其正常行爲的一部分fork()/ execs()另一個包含一些不穩定遺留代碼的可執行文件。除了這個庫之外,這個可執行文件沒有用,所以我想避免將它放在PATH目錄中。我也希望能夠在多個位置安裝多個副本,因此硬編碼路徑是不可取的。有沒有什麼等價於一個RPATH可以讓exec()找到這個可執行文件?或者,是否可以從庫本身查詢共享庫的rpath?可執行文件的RPATH等效

編輯:這篇文章暗示後者是可能的。如果有人知道所問問題的答案,我會保持開放。 Is there a way to inspect the current rpath on Linux?

+0

Hobbes,你在使用autotools嗎? – 2011-03-31 19:54:58

+0

larsmans:沒有autotools。 CMake的。 – tgoodhart 2011-03-31 19:55:52

+0

好的。無關緊要。 Autotools支持將後端二進制文件放在一個名爲'$ prefix/libexec'的目錄中,這是這個東西的傳統地方。在FHS下它是'/ usr/{local /} lib/PACKAGE'。這不直接回答你的問題,但我知道,至少和Ubuntu建議'RPATH'。 – 2011-03-31 19:59:36

回答

1

您總是可以使用getenv來獲取共享對象內的環境,但是RPATH真的是您想要的嗎?讓共享對象在用戶的主目錄(或自定義環境變量)中具有某種配置文件,告訴它要使用哪個位置來運行外部二進制文件,這不是更好嗎?

+0

自定義環境變量不可取,因爲它會暴露相當大的實現細節。配置文件將是困難的,因爲不能保證可執行文件的位置,並且我想支持具有多個可執行文件的副本。我可以寫一個配置文件作爲RPM post安裝腳本的一部分,或者其他類似的東西,儘管我真的很喜歡這個進程對這個庫的任何用戶都是透明的。 – tgoodhart 2011-03-31 19:51:40

0

我認爲最好的方法是設置一個環境變量並使用execve()來運行二進制文件。大概你可以設置PATH然後execve()一個使用PATH來查找可執行文件副本的shell。該庫相當於將LD_LIBRARY_PATHexecve()設置爲將此庫作爲依賴項的二進制文件。

無論哪種情況,您都不會更改外部環境,只會製作與execve()一起使用的修改後的副本。

相關問題