共享库不能访问程序的内存

Posted

技术标签:

【中文标题】共享库不能访问程序的内存【英文标题】:Shared library can not access memory of a program 【发布时间】:2014-09-04 14:28:01 【问题描述】:

对不起我的英语。我创建了一个共享库,我的程序动态加载它。 它工作正常,但问题是我将指针传递给共享库,但这无法访问指针内存。反之则没有问题。

关于如何解决这个问题的任何想法?

注意:我使用的是 linux,但如果这个想法适用于其他操作系统,我会搜索这个等价物

代码如下:

unsigned analizer::analizeText() 
std::cout << "thread started" << std::endl;
while(true)

    pause.lock();
    varMu.lock();
    unsigned enable = __enable;
    unsigned line   = __line;
    unsigned _colum = __colum;
    unsigned offset = __offset;
    varMu.unlock();

    unsigned begin = offset;
    std::cout << "get usafed docs" << std::endl;
    std::cout << doc->getText() << std::endl;//the program crash
    vector<document*> doc = _openDocuments->getUnsavedDocs(_openDocuments->traductDoc(this->doc)); std::cout << "relized" << std::endl;
    while (beginElements.find(_openDocuments->getChar(begin-l)) == beginElements.end() and begin > 0)
        --begin;

    word = this->doc->getText().substr(begin,_offset-begin);

    delete UunFile;

加载库:

#include <iostream>

pBear::language *_language;

using namespace pBear;

void language::load()

    boost::filesystem::directory_iterator end;
    for (boost::filesystem::directory_iterator it(languagePath); it != end; ++it)
    
        void *hndl = dlopen(it->path().c_str(), RTLD_NOW);
        if(hndl == NULL)
        
            std::cerr « dlerror() « std::endl;
             exit(-1);
        
        std::function<LanguageDatas*(pBear::openDocuments*)> fun = (LanguageDatas*(*)(pBear::openDocuments*)) dlsym(hndl, "colorMaker");
        LanguageDatas *dat = fun(openDocuments);
        dataLanguages[dat->getName()] = dat;
    

传递指针:

ana = _language->getLanguage(doc->getProyect()->getLanguage())->getAnalizer(doc);

程序的最后消息:

分析

线程开始

获取使用过的文档

分段错误(核心转储)

【问题讨论】:

代码照片 - 非常糟糕,请将您的代码粘贴为文本 也添加错误信息。 好的,我添加了程序的最后一条消息 【参考方案1】:

在:

std::function<LanguageDatas*(pBear::openDocuments*)> fun = (LanguageDatas*(*)(pBear::openDocuments*)) dlsym(hndl, "colorMaker");
LanguageDatas *dat = fun(openDocuments);

您似乎试图在该共享库中查找名称为 colorMaker 的 C++ 函数。然后你调用dlsym 的结果而不检查NULL

可能是dlsym 返回NULL,因此是分段错误。

C++ 函数的 C 风格名称 colorMaker 令人怀疑。仔细检查该共享库中的符号名称。

dlsym从不抛出C++异常,所以需要检查它的返回值:

LanguageDatas(*fun)(pBear::openDocuments*) = static_cast<(LanguageDatas(*)(pBear::openDocuments*)>(dlsym(hndl, "colorMaker"));
if(!fun)
    throw std::runtime_error("colorMaker function is not found");
fun(openDocuments);

请注意,您无需将函数指针包装到 std::function 中即可调用它。

【讨论】:

库已加载,不是问题。问题是文档 *doc 是来自程序的指针,但库无权读取它。有什么办法解决这个问题吗? 抱歉,我发现了问题。看来“export var”对于共享库来说是非常危险的。谢谢

以上是关于共享库不能访问程序的内存的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信 - 动态链接库中共享内存(利用DLL的2~3G的地址段空间)

关于windows service不能访问网络共享盘(NetWork Drive)的解决方案

dlclose() 后访问共享库分配的内存

c# 通过内存映射实现文件共享内存

linux 学习笔记 20160621

为啥宿主机不能访问虚拟机