2010-12-03 49 views
2

我試圖設置特定的LD_LIBRARY_PATH來加載libpcap的修改版本,而不是系統範圍的。在加載perl模塊之前修改ld.so路徑

這個作品當然如果我用LD_LIBRARY_PATH=/blah ./script_name運行整個腳本。我想讓這個用戶透明,所以我嘗試設置$ENV{'LD_LIBRARY_PATH'}。但這並不會改變行爲。我試圖將它放在BEGIN區塊中,以使其在其他use-s之前工作,但在那裏也沒有運氣。

我懷疑這是因爲在運行腳本的任何部分之前,在進程開始時ld加載所有配置/配置自身。有什麼方法可以使它工作嗎?

我想避免這樣愚蠢的事情:

if (check_parent()) { $ENV...=.... ; `$0` ; exit } 

(或外部包裝作爲被建議 - 少克魯夫特和隨機包裝越好)

+3

如何使用包裝bash腳本將導出任何變量,然後執行您的perl腳本? – thkala 2010-12-03 15:27:02

+0

@thkala:這當然會起作用,但我已經爲這個腳本提供了另外一個包裝器(並且它實際上不負責設置env變量),並且在某些時候很難管理所有層。我正在尋找一種方法來做到這一點,沒有任何外部幫手。 – viraptor 2010-12-03 15:30:03

回答

5

可以更換與你的腳本頂部

#!/bin/sh 
LD_LIBRARY_PATH="/blah:$LD_LIBRARY_PATH" 
export LD_LIBRARY_PATH 
exec perl -x -S "$0" "[email protected]" || exit 1 
#!perl 

# rest of your script 
0

在Perl腳本內設置LD_LIBRARY_PATH的原因是沒有效果的是,到時候Perl正在運行,動態加載器已經讀取LD_LIBRARY_PATH並且不會重新讀取它。因此,即使BEGIN塊已經太晚 - 動態加載器已經讀取了它所需要的內容。