【发布时间】:2014-01-09 17:42:03
【问题描述】:
我使用 MSVC 2010 创建了一个 Win32-DLL,其中包含不需要的导出 C++ 符号。我正在使用模块定义文件 (.def) 和 __stdcall 约定来处理我想要导出的特定功能。但是,由于我也在使用 Boost 序列化,因此有大量从 Boost 导出的 C++ 符号。由于这个事实,这些符号由 Boost 导出(找到 here):
我正在使用 1.44.0 的 boost::serialization。我注意到的一件事 是静态链接到序列化库会添加几个 我得到的最终 exe 文件中有一百个导出。使用
dumpbin /exports my_program.exe这些函数不是从库中显式调用的。但是他们 ARE 作为序列化过程的一部分调用。它只是那个 MSVC 没有看到他们。因此,当您编译发布时,MSVC 链接器 剥离它们,程序将不再工作。为了工作 围绕这一点,这些函数被显式导出。这可以防止 MSVC 从剥离它们。有关更多信息,请参阅 force_include.hpp
导出的符号(摘录):
class boost::archive::detail::extra_detail::map<class boost::archive::binary_oarchive> & >boost::serialization::singleton<class boost::archive::detail::extra_detail::map<class boost::archive::binary_oarchive> >::get_instance(void)'::`2'::`local static guard'{2}'
您可以通过创建一个 DLL 项目并包含 Boost(链接到 libboost_serialization-vc100-mt-gd-1_55.lib)来重现这种情况:
#include <boost/archive/binary_oarchive.hpp>
#include <fstream>
extern "C" int __stdcall test();
int __stdcall test() {
std::fstream stream;
boost::archive::binary_oarchive o(stream, boost::archive::no_header);
return 1;
}
我测试了 GNU 实用程序 strip from binutils。但是,它似乎总是删除所有符号。例如。使用这个命令
strip --strip-symbol=test DllBoostTest.dll -o test.dll
这个简单的测试不起作用。它应该只删除测试符号。不幸的是,它也删除了所有符号。使用通配符和-N 也不起作用,因为它也会删除所有导出。
那么有没有办法删除所有不需要的 boost C++ 符号?比如说,删除所有带有“boost”文本的符号?
如果您需要更多信息,我很乐意提供。
注意:这与调试或 PDB 文件无关!
【问题讨论】:
标签: visual-studio-2010 dll symbols strip portable-executable