2015-07-10 111 views
0

從共享對象(.so)內訪問共享內存(內存映射文件,使用固定地址0x60000000)時,出現段錯誤。從.so(共享對象)內使用內存映射文件

我們有很多應用程序訪問這個共享內存沒有困難。 我的應用程序不同之處在於我創建了一個小的.so,而.so是一個調用mmap並訪問共享內存的應用程序。

mmap()返回就好。我請求的地址已正確返回。但是,只要我嘗試從這個.so中訪問內存,它就會發生故障。

我不明白什麼是獨特的.so,這將阻止它訪問共享內存這種方式。

任何人都有想法?

+0

正確構建('-fPIC')共享對象沒有什麼特別的東西編譯所有的警告和調試信息。使用'gdb'調試器。顯示一些代碼,我們無法猜測它。使用'strace' –

+0

當您嘗試訪問內存位置時,確定映射文件仍然存在嗎?如果訪問文件的那部分不再有意義(例如,文件被刪除或縮小),則可以獲得'SIGSEGV'或'SIGBUS' –

+0

使用-fPIC並確認文件存在。這是一個遺留系統,所以小代碼片段太困難了。但這些問題都很好。 – Spaceman5

回答

2

在一般情況下,從共享庫訪問mmap版內存是沒有辦法從一個主可執行訪問它不同,你就可能找錯了樹。這就是說,這樣的:

內存映射文件,使用0x60000000

一個固定的地址一般是非常糟糕的主意,因爲你有過什麼(如果有的話)是mmap版沒有控制在那之前。一個MAP_FIXED映射將簡單地刪除任何以前的映射存在。 如果您的圖書館本身恰好映射到那裏,那麼您將替換圖書館.text.data,結果幾乎肯定會是一場神祕的崩潰。

+0

我們在這個遺留系統上的所有人都同意一個固定地址「不愉快」。它在那裏支持舊Fortran應用程序,這些應用程序需要具有共享內存的固定地址才能工作。但如果地址不可用,mmap()會失敗嗎?此外,另一個程序正在運行,已經爲我映射了地址。所以,我會認爲記憶已經準備好了。 – Spaceman5

+0

@ Spaceman5否,'mmap(...,MAP_FIXED ...)'不會失敗,如果地址已經有了一個映射,它將會取代現有的映射。而另一個程序映射地址的事實則無關緊要:共享庫放置位於*每個進程*基礎上。 –