2015-07-10 72 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 ...)'不会失败,如果地址已经有了一个映射,它将会取代现有的映射。而另一个程序映射地址的事实则无关紧要:共享库放置位于*每个进程*基础上。 –