Libraries

為什麼共享庫是可執行的?

  • September 18, 2012

為什麼幾乎所有的共享庫/usr/lib/都設置了可執行權限位?我沒有看到任何執行它們的案例。有些確實設法連接某種形式的main功能來列印簡短的版權和版本說明,但許多人甚至不這樣做,並且在執行時會出現段錯誤。

那麼,設置這個有什麼意義x呢?所有的圖書館打包者都必須這樣做嗎?如果我dlopen()的共享庫有0644權限會發生什麼?

在 HP-UX 下,共享庫使用 mmap() 映射到記憶體中,系統中的所有記憶體頁面都有保護位,這些保護位與核心和處理器硬體的記憶體頁面保護機制相結合。為了執行系統上任何記憶體頁面的內容,該頁面必須設置 PROT_EXEC - 這是防止數據執行漏洞的有用功能。

mmap() 呼叫使用它要映射的文件上的權限位來定義要包含它的映射記憶體頁的保護位:rwx -> PROT_READ|PROT_WRITE|PROT_EXEC(來自 sys/mman.h)。因此,為了使共享庫在 HP-UX 上可用,包含共享庫的文件必須具有執行權限,以確保映射庫也具有執行權限。

HP-UX 系統上模式為 644 的共享庫將導致核心轉儲。

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