现在的情况是,我有一个 exe 需要调用有个 dll(假设A),这个 dll 又静态链接了一堆dll(因业务需要,不可精简)
但是在exe中使用 loadlibrary 加载 A 的时候,会失败,错误码是 8 ,也就是空间不足结果可以理解,因为 A 后面的 dll 实在太多了,所有的dll文件加起来有 500多M(我也很崩溃,怎么这么多!)经过初步定位,加载失败的原因应该是全局变量过多造成内存不足.我现在的问题是:
1.一个exe进程所能加载的 dll 内存大小应该是有限制的,好像是256M,但是这个限制是指对什么的限制,例如是全局变量的内存,还是包括代码空间?2.在没有dll代码的情况下,能否知道每一个dll的初始化的时候所占用的空间?如果可以,如何分析,用什么工具等等?(我简单用了一下 IDA,但是没有什么头绪)谢谢

解决方案 »

  1.   

    没听说过 256M 的限制;知道静态 VC 链接库的 dll 个数有个 64 的限制。帮你顶顶。
      

  2.   

    没听说过,这DLL也太牛了吧,为什么不分成几部分;
      

  3.   

    这么大的DLL,设计上就有点不合理,应该要提供者修改.
      

  4.   


    你说的忒对了
    小弟也是这么想的,但是要首先定位出是哪个DLL占用的内存过大PS.
    dll的静态大小由于一些原因,无法缩减!
    由于历史和现实的原因,真的无法缩减!
    现在能做的就是找到具体无法加载的原因,做有限度的优化能不能有什么办法,谢谢
      

  5.   

    这么大的DLL,设计上就有点不合理,应该要提供者修改. 
     
      

  6.   


    我之所以说 256M 的限制,是因为我重现的时候,测试一个dll,如果申请了过大的内存,编译也能成功
    但是会VC会提示:Release/TestDll.dll : warning LNK4084: total image size 1073803264 exceeds max (268435456); image may not runTestDll.dll - 0 error(s), 1 warning(s)因此我觉得是不是说有这个限制,因为这个测试的dll编出来本身是比较小的,才56K,但是编译的时候已经有这样的提示了另外,你说的 64 个 dll 限制的出处是哪里,能否提供原始文档
    非常感谢!
      

  7.   


    多谢回复这个已经有考虑的,但是现在的dll有很多,有30个以上(具体多少,我要到公司里才能知道)
    但是粗略想了一下,似乎拆分也不会有多少作用可能是真的很牛,是一个非常大的系统...
    具体我也不是很清楚,我是外围人员
      

  8.   

    关于 64 个静态链接的 dll 的问题,现在记不得如何才能找到资料了;关于这个问题,你可以这样验证:编写一个简单的 dll,复制文件,然后修改名称成 1.dll, 2.dll, ..., 64.dll;
    然后进行 LoadLibrary,...,你会发现不到 64.dll,就会装载失败;但是如果你使用 LoadLibraryEx,参数 LOAD_LIBRARY_AS_DATAFILE,64 不是一个限制;记得原因是与 TLS 相关,好多年前的事情了,实在记不得来源了...如果找到了,再说吧
      

  9.   

    这些dll肯定不是同时使用,你应该根据需要load和unload
      

  10.   

    楼上说的也是一个办法,但是这个系统是从UNIX移植过来的,因此不大会花很大的力气重构代码,否则会衍生很多问题
    现在就是想知道哪些DLL产生了什么问题
    不过从回帖来看,好像大家对这方面似乎了解不多